微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

linux – 用sed中变量中存储的文件内容替换两行之间的文本

假设我有一个名为original.txt的文件,其中包含以下内容

红色
蓝色

餐饮

灰色
白色

我还有一个名为new.txt的文件,其中包含以下内容

绿色
黑色
黄色
紫色

现在我想编写一个脚本,用original.txt中的内容替换original.txt中蓝色和灰色之间的线,所以它给了我这个结果:

红色
蓝色
绿色
黑色
黄色
紫色
灰色
白色

我为此目的编写了这段代码(新文件名称并不总是相同,因此它存储在变量中):

newtext="new.txt"

sed -i "/blue/,/gray/{
    r $newtext
    d
}" original.txt

但是,在运行它时,我得到了这个废话:

red
green
black
yellow
purplegreen
black
yellow
purplegreen
black
yellow
purplegreen
black
yellow
purplegreen
black
yellow
purplewhite

我究竟做错了什么?

解决方法:

这可能适合你(GNU sed):

sed '/blue/,/gray/!b;//!d;/blue/r file2' file1

对于蓝色和灰色之间的线条范围,删除与范围中的第一行或最后一行不匹配的行,并读取要在范围的最后一行之前插入的行.

编辑:

一个sed命令/ blue /,/ gray /!匹配一系列行,即包含蓝色的行和包含灰色行的行之间的行. !b部分表示如果行不在该范围内,则断开sed命令,即不对这些行进行任何进一步的sed处理,只是正常打印.

以下sed命令仅影响蓝色和灰色范围内的那些行.

第二个命令//!d表示:删除那些与范围的开始/结束不匹配的行,即蓝色或灰色. //使用前一个/…/命令的正则表达式.注: delete命令终止该行的任何进一步的sed处理.

以下sed命令仅影响包含蓝色或灰色的行.

第三个命令匹配包含蓝色的行并从file2读取行.

注:包含蓝色和灰色的线条由sed自然处理并在下一行读入图案空间之前打印,而不是蓝色和灰色之间的线条.

替代:

sed '/blue/,/gray/!b;//!d;/gray/e cat file2' file1

而另一个

sed -ne '/blue/{p;r file2' -e ':a;n;/gray/!ba};p' file1

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐