使用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));