Regex 如何使用sed删除匹配行,即上面的行和下面的行?
我在一个文件中多次出现以下序列:Regex 如何使用sed删除匹配行,即上面的行和下面的行?,regex,sed,Regex,Sed,我在一个文件中多次出现以下序列: yyyy xxxx zzzz 我有一个与xxxx匹配的正则表达式。只要有匹配项,我就要删除该行、前一行(例如yyyy)和后一行(例如zzzz)。如何使用sed来实现这一点?这是我在perl中实现的方法,也许它可以帮助您走上正确的道路。。。祝你好运 open(INFILE,"<in.txt"); my(@arrayOutBoundData, $skipNextLine)l for (<INFILE>) { if (not $skipNe
yyyy
xxxx
zzzz
我有一个与xxxx匹配的正则表达式。只要有匹配项,我就要删除该行、前一行(例如
yyyy
)和后一行(例如zzzz
)。如何使用sed来实现这一点?这是我在perl中实现的方法,也许它可以帮助您走上正确的道路。。。祝你好运
open(INFILE,"<in.txt");
my(@arrayOutBoundData, $skipNextLine)l
for (<INFILE>) {
if (not $skipNextLine) {
if (/^xxxx$/) {
pop(@arrayOutBoundData);
$skipNextLine = 1;
} else {
push(@arrayOutBoundData,$_);
}
}
$skipNextLine = 0
}
open(OUTFILE,">out.txt");
for (@arrayOutBoundData) {
print OUTFILE;
}
open(infle,“out.txt”);
for(@arrayOutBoundData){
打印输出文件;
}
(未测试此系统上没有perl,请原谅任何越站行为。)您可以签出。它包括使用sed处理多行。诀窍是将最后一行存储在“保留空间”中
sed-n'
/^xxxx/{n
N
x
D
}
x
1d
P
${x
P
}
'
从x
-将当前输入行与保留空间(x
)交换开始,然后对于第一行,不打印任何内容(1d
),后续行打印刚从保留空间交换的行(p
),在最后一行再次交换保留空间并打印其中的内容($x{p})
。这就剩下了当我们到达目标行(从/^xxxx/
开始)时要做的事情-将接下来的两行读入模式空间(n
),并将模式空间与保留空间(x
)交换-这将保留我们要打印的下一行的保留空间和匹配前的行的图案空间,这是我们不想要的,因此我们放弃了它(d
)grep-v-f这可能适合您(GNU-sed):
这将在模式空间中保留一个两行窗口,如果在第一行或第二行中找到所需的regexp,则读取下一行,然后删除所有三行。边缘情况是,如果在第一行或最后一行中找到regexp,而之前/之后没有行。在这些情况下,只能删除两行。
顺便说一句,此解决方案可能在GNU sed中发现了一个可能的错误。地址的M
标志允许^
和$
元字符用作多行字符串中regexp行的开始和结束的零长度标记。空地址/
重用先前声明的地址。应该该地址是包含多行标志的地址吗?目前它似乎包含该标志,即使没有说明,即
sed 'N;/^xxxx/M{/^xxxx/d;$!N;d};P;D' file
产生不同(正确)的结果,以:
sed 'N;/^xxxx/M{//d;$!N;d};P;D' file
如果xxxx
出现在文件的第二行。您可以使用以下选项:
sed -n '/xxxx/{N;s/.*//;x;d;};x;p;${x;p;}'
这将用一个空行替换3行。您可以首先反转文件,使用sed
删除匹配的行和下一行(或sed
命令中的行,+Nd
),最后反转结果:
tac old.file | sed -e '/xxxx/,+1d' | tac > new.file
对“x”命令的进一步解释是:我不能运行上面的脚本。它说sed:FUNCTION/^pattern/{n x d}x 1d p${x p}不能被解析。不知道为什么?差不多,但他希望zzzz也消失。
sed 'N;/^xxxx/M{//d;$!N;d};P;D' file
sed -n '/xxxx/{N;s/.*//;x;d;};x;p;${x;p;}'
tac old.file | sed -e '/xxxx/,+1d' | tac > new.file