我想使用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));
答案 0 :(得分:1)
这可能适合你(GNU sed):
sed 'N;s/,\(\s*\n\.BBB\)/);\1/;P;D' file
在模式空间中读取两行并替换匹配,将之前的,
替换为);
。
P.S。我假设\n
代表分隔每一行的换行符。
编辑:
命令P
打印到模式空间中的任何换行符\n
。如果模式中没有换行符,则打印整个模式并附加换行符。
命令'D'删除模式空间中的任何换行符\n
。如果在执行命令之前模式空间中有换行符,则之后如果模式空间不为空,则不会将新行读入模式空间并继续执行sed命令,就好像已将新行读入彭定康空间。如果模式空间为空,则恢复正常处理,模式空间由正在读取的文件的下一行填充(减去其换行符)。
答案 1 :(得分:0)
我会使用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}
答案 2 :(得分:0)
sed -n -e '1h;1n;/BBB/h;//!{x;p};$p' file
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));