使用Sed在匹配前更换线路

使用Sed在匹配前更换线路,sed,replace,Sed,Replace,我想在匹配前使用sed 输入文件 .AAA(AAA), .BBB(BBB)); .AAA(AAA), .CCC(CCC), .BBB(BBB)); .AAA(AAA), .DDD(DDD), .BBB(BBB)); 我可以替换匹配行.BBB(BBB)) 但不知道如何在匹配前替换该行以获得此输出 .AAA(AAA)); .BBB(BBB)); .AAA(AAA), .CCC(CCC)); .BBB(BBB)); .AAA(AAA), .DDD(DDD)); .BBB(BBB)); 我会使用aw

我想在匹配前使用
sed

输入文件

.AAA(AAA),
.BBB(BBB));
.AAA(AAA),
.CCC(CCC),
.BBB(BBB));
.AAA(AAA),
.DDD(DDD),
.BBB(BBB));
我可以替换匹配行
.BBB(BBB))

但不知道如何在匹配前替换该行以获得此输出

.AAA(AAA));
.BBB(BBB));
.AAA(AAA),
.CCC(CCC));
.BBB(BBB));
.AAA(AAA),
.DDD(DDD));
.BBB(BBB));

我会使用
awk
而不是
sed

awk 'NR>1&&!/BBB/{print b}{b=$0}END{print b}' a.txt
说明:

我正在使用
b
缓冲前一行。从第2行开始,我检查当前行是否与
BBB
不匹配,并在这种情况下打印
b

NR>1&&!/BBB/{print b}
我使用以下方法将每一行存储在
b
中:

{b=$0}
到达最后一行后,我们打印
b

END{print b}
这可能适用于您(GNU-sed):

将两行读入模式空间,并在匹配时替换,将先前的
替换为

另外,我假定
\n
表示分隔每一行的换行符

编辑:

命令
p
最多打印并包括图案空间中的任何换行符
\n
。如果图案中没有换行符,则打印整个图案并追加换行符


命令“D”最多可删除并包括图案空间中的任何换行符
\n
。如果在执行命令之前,模式空间中存在新行,则在执行命令之后,如果模式空间不为空,则新行不会读入模式空间,sed命令的执行将继续,就像新行已读入模式空间一样。如果模式空间为空,则恢复正常处理,模式空间由正在读取的文件的下一行(减去其换行)填充。

sed-n-e'1h;1n/BBB/h;//!{x;p}$p'文件

  • sed-n
    除非使用
    p
    命令,否则不要打印
  • 1h;1n保存保留空间中的第一行并移动到第2行
  • /BBB/h
    在保留空间中保存与BBB匹配的行。这将丢弃上一行而不打印它
  • /!{x;p}
    对于不匹配BBB的行(
    /
    是以前的匹配模式),使用保留空间交换并打印。这将保存当前行并打印上一行
  • $p
    始终打印最后一行
输入:

.AAA(AAA), 
.BBB(BBB)); 
.AAA(AAA), 
.CCC(CCC), 
.BBB(BBB)); 
.AAA(AAA), 
.DDD(DDD), 
.BBB(BBB)); 
输出:

.BBB(BBB)); 
.AAA(AAA), 
.BBB(BBB)); 
.AAA(AAA), 
.BBB(BBB)); 

那些
,\n
是否在您的文件中显示为原始文本?\n不在我的文件中,我只想显示一个换行符@黃明明 我已经相应地编辑了这个问题。。。你必须自己努力解决这个问题才能得到帮助,所以这个版本的
sed
只是不同的迟钝语法。我个人喜欢疯狂使用
sed
,但是如果你在专业(公司)环境中这样做,你最终会得到没有人可以修改、维护甚至理解的代码。而且,如果用例稍微改变一下,sed
的内容可能会变得无限复杂。如果不是OP已经知道的编程语言,我建议您使用
awk
。您可以仔细检查问题奖。标题有误导性——如果这里的代码是正确的,OP只想用分号替换逗号。非常感谢。请您解释一下为什么要添加
;PD
。。。我尝试了一些没有
的案例;PD
也可以给出正确的结果,但某些情况下不能。此脚本可以全局运行,而不是仅运行一行。完美的
.BBB(BBB)); 
.AAA(AAA), 
.BBB(BBB)); 
.AAA(AAA), 
.BBB(BBB));