我想用 sed 通过 bash 脚本附加一些行。该脚本有效,但输出错误。
LINEB="word"
sed '/g id=\"..\"/a style=\"fill:$LINEB;\"' file.txt > foo.txt
我得到<g id="ai" style="fill:$LINEB;">
而不是<g id="ai" style="fill:word;">
即使我使用各种括号。
答案1
您不能将变量嵌入单引号内。你可以:
在整个 sed 脚本周围使用双引号,并反斜杠转义其中的所有双引号。
用 , 双引号变量结束单引号字符串
'
,然后再次重新开始单引号字符串:
LINEB="word"
sed '/g id=\"..\"/a style=\"fill:'"$LINEB"';\"' file.txt > foo.txt
答案2
首先,您需要注意$LINEB
为 pend 命令做好适当的准备sed
a
:
sed '/<\([^"<>]*\("[^"]*"\)* \)*g id="[^"][^"]"/a\'"$(echo;#"'
printf 'style="fill:"%s"\n' "$LINEB" |
sed 'H;1h;$!d;s/\\/&&/g;s/\n/\\&/g')
" <infile >outfile
在另一个文件中找到a
附加文本也可能更容易,然后您可以r
在适当的时候读入:
printf 'style="fill:%s"\n' "$LINEB" >/tmp/LINEB
sed '/<\([^"<>]*\("[^"]*"\)* \)*g id="[^"][^"]"/r /tmp/LINEB' <infile >outfile
rm /tmp/LINEB
这不需要逃避。