Linux 在bash脚本中用多行文本替换模式
我有一个bash变量:Linux 在bash脚本中用多行文本替换模式,linux,bash,awk,Linux,Bash,Awk,我有一个bash变量: VAR="This is \n what i want" 和包含以下内容的文件: asdf zxcv qwer 我想用$VAR(多行文本)替换zxcv的每一次出现 如何使用awk或sed进行此操作? 我试过: sed -i 's/zxcv/'$VAR'/g' filename sed -i "s/zxcv/$VAR/g" filename sed -i "s/zxcv/$(VAR)/g" filename sed -i "s/zxcv/$(($VAR))/g" fil
VAR="This is \n what i want"
和包含以下内容的文件:
asdf
zxcv
qwer
我想用$VAR(多行文本)替换zxcv的每一次出现
如何使用awk或sed进行此操作?
我试过:
sed -i 's/zxcv/'$VAR'/g' filename
sed -i "s/zxcv/$VAR/g" filename
sed -i "s/zxcv/$(VAR)/g" filename
sed -i "s/zxcv/$(($VAR))/g" filename
sed -i "s/zxcv/`echo -n $VAR`/g" filename
使用
gnu awk
,您可以通过在命令行上传递变量的值来实现这一点:
var=$'This is \n what i want'
awk -v var="$var" -v w='zxcv' 'n=index($0, w){
$0 = substr($0, 1, n-1) var substr($0, n + length(w))} 1' file
如果搜索词出现在单独的行中(如问题所示),则此命令可以简化为:
awk -v var="$var" -v w='zxcv' 'index($0, w)==1{$0 = var} 1' file
您也可以使用GNU
sed
:
$ var="This is \n what i want"
$ sed "s/^zxcv/$var/" file
asdf
This is
what i want
qwer
该键使用双引号而不是单引号,因此将$var
的值插入到sed替换字符串中
(顺便说一句,按照惯例,用户变量在Bash中使用小写。)
从评论中可以看出:Ed Morton的版本更好,因为它使用了字符串连接,并且只将变量组件公开给shell解释:
$ sed 's/^zxcv/'"$var"'/' file
使用该I have
gnu-sed
ver:4.4
,此命令将为我提供sed:-e表达式#1,char 16:unterminated
s'命令`Trysed's/^zxcv/'$var'/'
。在编写时,整个命令将暴露给shell进行解释,而不仅仅是要扩展的变量。idk是否能解决问题,但使用正确的报价始终是一个很好的起点,值得一试。不幸的是,我在gsed的/^zxcv/'“$var”/'文件中也遇到了同样的错误。我也在使用GNU sed 4.4(在cygwin上的bash 4.4.12(3)中),引用的两个版本对我都有效(我终于开始尝试它了:-)。我看到您使用的是var=$'foo'
,而不是var='foo'
。这就是问题所在-当我传递\n
时,您正在将一个包含文字换行符的变量传递给sed。如果var
包含一个&
,这将以加密方式失败,就像任何sed解决方案一样(但sed也会在\1
等情况下失败)。使用文字字符串…字符串\n
应该保留在输出中,还是用文字换行符替换?是否希望“代码> \n/CODE >周围的空白字符保留在输出中或被删除?根据发布的输入发布预期的输出。
$ sed 's/^zxcv/'"$var"'/' file