我有一个脚本,其中$variable
存储了行数不确定的文本。假设我已经命名它script.bash
并且它位于$HOME
:
#!/bin/bash
# commands on the beginning of my script
variable='Lorem Ipsum is simply dummied
text of the printing and
typesetting industry. Lorem Ipsum has been the
industry standard dummy text ever since the 1500s'
# commands at the end of my script
我想创建一个新脚本来更改variable
on中的文本script.bash
。代码的想法是这样的:
#!/bin/bash
file="$HOME/script.bash"
mynewvariable='one
two
three'
substitute_everything_inside_variable () {
# code
}
substitute_everything_inside_variable "$mynewvariable" "$file"
只要它只有一行,它就可以用新的一行替换整行,sed
如下所示:
sed -i "5s/.*/$mynewvariable/" "$HOME/script.bash"
但是考虑到我需要替换单引号内的所有内容(并且其中的文本行数是可变的),我不知道如何使用命令行工具来做到这一点。有没有办法在不阅读和解释每一行发生的事情的情况下做到这一点?
替换文件的全部内容比更改包含许多您不想破坏的其他内容的文件中的多行引号字符串要容易得多。
尝试将 的内容
$variable
放入文件(例如vfile.txt
),并让您的 shell 脚本执行类似variable="$(cat vfile.txt)"
.然后,您可以使用任何您想要替换或修改的方法
vfile.txt
。Sed 具有除
s
. 您可以查找起始行,删除所有行,直到值的最后一部分,然后插入新值。但是,要正确引用是很棘手的-请注意,s/…/$mynewvariable/
不仅换行符失败,而且'
,\
和/
. 在 Perl 中更容易做到这一点。如果文件不是太大而无法放入内存,告诉 Perl 读取整个文件,而不是逐行分解它。未经测试。
说明:
perl -0777 -i -p
对文件内容运行 Perl 程序,然后替换文件。-0777
意味着一次性处理整个文件,而不是逐行处理。sed s/…/$mynewvariable/
不起作用的原因相同)。\x27
是单引号(我把 Perl 代码放在单引号内,所以我不能在里面使用单引号)。$replacement =~ …
替换代表单引号外壳字符串文字内部'
的值。'\''
'
(?:[^\x27]|\x27\\\x27\x27)
匹配任何一个'\''
或任何不是'
.由于您知道它在 script.bash 文件中所在变量的行号,您可以这样做:
这样您就可以避免变幻莫测的引用和 $variable 的未知行跨度。
高温高压