我有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
答案 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
使用