在bash脚本中使用多行文本替换模式

时间:2018-05-23 14:30:14

标签: 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" filename
sed -i "s/zxcv/`echo -n $VAR`/g" filename

2 个答案:

答案 0 :(得分:3)

使用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

asdf
This is
 what i want
qwer

如果搜索词出现在单独的行中(如问题所示),则此命令可简化为:

awk -v var="$var" -v w='zxcv' 'index($0, w)==1{$0 = var} 1' file

答案 1 :(得分:0)

您也可以使用GNU sed

$ var="This is \n what i want"
$ sed "s/^zxcv/$var/" file
asdf
This is 
 what i want
qwer

关键是使用双引号与单引号,因此$var的值将插入到sed替换字符串中。

(顺便说一句,按照惯例,在Bash中使用小写用户变量。)

来自评论:通过使用字符串连接并仅将变量组件暴露给shell解释,Ed Morton的版本更好:

$ sed 's/^zxcv/'"$var"'/' file

使用