使用变量字符串查找行,将整行替换为嵌套循环生成的另一行

时间:2016-11-20 00:56:04

标签: bash awk replace sed line

我有一个以:

开头的脚本
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。

提前致谢!

1 个答案:

答案 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命令的用法。内部双引号\需要转义