繁体   English   中英

如何用不包含特定字符串的同一行替换文本?

[英]How to replace the text with not containing specific string with the same line?

输入文本文件:file.txt

AAA
BBB_CCC
BBB
AAA BBB

需要获得:

AAA_CCC
BBB_CCC
BBB_CCC
AAA_CCC BBB_CCC

我用以下正则表达式调用sed:

sed "/_CCC/! s/AAA/AAA_CCC/g;/_CCC/! s/BBB/BBB_CCC/g" file.txt > file_out.txt

但是会产生:

AAA_CCC
BBB_CCC
BBB_CCC
AAA_CCC BBB

一种解决方案是在同一文件上两次调用sed,但我认为存在一种更优雅的方法。

一种方法是,如果存在_CCC系统地对其进行覆盖:

sed 's/\(AAA\|BBB\)\(_CCC\)\?/\1_CCC/g' file

使用ERE:

sed -E 's/(AAA|BBB)(_CCC)?/\1_CCC/g' file

_CCC附加到不包含_CCC的每个字段的awk解决方案:

awk '{ for(i=1; i<=NF; i++) if( $i !~ /_CCC$/ ) $i = $i"_CCC"; }1' file

#output:
AAA_CCC
BBB_CCC
BBB_CCC
AAA_CCC BBB_CCC

在精神上最接近您的解决方案:

$ sed -E '/_CCC/!s/(AAA|BBB)/\1_CCC/g' infile
AAA_CCC
BBB_CCC
BBB_CCC
AAA_CCC BBB_CCC

您的解决方案失败,因为在最后一行插入_CCC之后, /_CCC/! 检查失败:字符串现在在那里。 我的解决方案通过仅使用一个替换命令就避免了该问题。

另一个awk

$ awk -v RS=' +|\n' '{sub("(_CCC|)$","_CCC"); ORS=RT}1' file

AAA_CCC
BBB_CCC
BBB_CCC
AAA_CCC BBB_CCC

另一个sed解决方案:

$ sed 's/\(_CCC\)*\( \|$\)/_CCC\2/g' file
AAA_CCC
BBB_CCC
BBB_CCC
AAA_CCC BBB_CCC

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM