我有一个以:
开头的脚本sed 's!'$1'!'$2'!g' file.txt > new.txt ;
$ 1和$ 2是变量,第三个变量$ 3稍后在脚本中使用,脚本以这种格式执行:
./script.sh variable variable2 variable3
脚本的下一部分将第三个变量添加到文本文件中:
sed "s!><!> $3 <!4" newer.txt > newest.txt
我现在要做的是使用&#34; newest.txt&#34;的输出。 (这是一行,包括像/&lt;&gt;&#34; / html中的字符),并替换另一个使用variable2作为匹配标识的文件中的一行。
这就是我所拥有的,但它似乎并没有取代整条生产线,只是替代。
for i in `cat newest.txt` ;
do
sed '/$2/s/.*/$i/' new.txt > final.txt
done
我在Solaris上使用sed时不允许使用-i开关。最好是Sed,awk或bash。
提前致谢!
答案 0 :(得分:2)
使用r
命令从文件读取将是健壮的,因为它不会基于文件内容或多行文件输入而中断
sed -e "/$2/r newest.txt" -e "/$2/d" new.txt > final.txt
或
sed -e "/$2/r newest.txt" -e '//d' new.txt > final.txt
感谢@ mklement0指出替换内容会影响结果,并且我们可以重用d
命令的模式:
说明各种情况:
$ cat ip.txt
foo
bar
baz
123
$ s='ba'
$ echo 'XYZ' > f1
$ r=$(<f1)
$ sed "/$s/s/.*/$r/" ip.txt
foo
XYZ
XYZ
123
$ sed "/$s/c$r" ip.txt
foo
XYZ
XYZ
123
$ sed -e "/$s/r f1" -e '//d' ip.txt
foo
XYZ
XYZ
123
如果替换字符串包含/
$ echo '/XYZ/' > f1
$ r=$(<f1)
$ sed "/$s/s/.*/$r/" ip.txt
sed: -e expression #1, char 11: unknown option to `s'
$ sed "/$s/c$r" ip.txt
foo
/XYZ/
/XYZ/
123
$ sed -e "/$s/r f1" -e '//d' ip.txt
foo
/XYZ/
/XYZ/
123
对于多行:
$ echo -e 'XYZ\nABC' > f1
$ r=$(<f1)
$ sed "/$s/s/.*/$r/" ip.txt
sed: -e expression #1, char 12: unterminated `s' command
$ sed "/$s/c$r" ip.txt
sed: -e expression #1, char 10: unknown command: `A'
$ sed -e "/$s/r f1" -e '//d' ip.txt
foo
XYZ
ABC
XYZ
ABC
123
注意:某些sed
版本可能需要sed "/$s/c\\$r" ip.txt
,其中c\
是c
命令的用法。内部双引号\
需要转义