Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 如何使用sed删除匹配行,即上面的行和下面的行?_Regex_Sed - Fatal编程技术网

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