使用Sed

时间:2017-05-31 12:20:57

标签: 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));

3 个答案:

答案 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));