sed替换test1.txt变量后如何与test2.txt合并得到目标内容?
解决方案
方法1:管道结合cat合并输出
直接将sed处理test1.txt的结果通过管道传递给cat,同时让cat读取test2.txt的内容:
NAME=bob sed '$ s/NAME\$/'$NAME'/' test1.txt | cat - test2.txt
这里的-代表从标准输入(即sed的输出)读取内容,之后拼接test2.txt的内容,就能得到目标结果。
方法2:分命令执行(简单直接)
先执行sed处理test1.txt,再直接输出test2.txt的内容,两个命令的输出会连续显示:
NAME=bob sed '$ s/NAME\$/'$NAME'/' test1.txt; cat test2.txt
方法3:让sed直接处理两个文件(简化版)
因为test2.txt中没有需要替换的NAME,可以去掉sed的行地址限制,直接对所有行替换行尾的NAME,同时传入两个文件:
NAME=bob sed 's/NAME\$/'$NAME'/' test1.txt test2.txt
你之前命令失效的原因
你执行sed '$ s/NAME$/'$NAME'/' test1.txt test2.txt时,sed会分别处理每个输入文件:
- 对test1.txt,
$代表它的最后一行,本该替换,但可能因为shell变量展开的细节(比如未转义的$被shell误解析)导致替换未生效; - 对test2.txt,
$代表它的最后一行(即Goodbye),自然不会匹配NAME$。
用双引号包裹sed命令可以避免变量展开的问题,更稳妥的写法是:
NAME=bob sed "$ s/NAME\$/$NAME/" test1.txt | cat - test2.txt
内容的提问来源于stack exchange,提问作者Fabrice
相关产品推荐
相关产品推荐

