2009-05-18 540 views

回答

12

诀窍是存储在“保留空间”中看到的最后一行。

sed -n ' 
/^xxxx/{n 
     n 
     x 
     d 
     } 
x 
1d 
p 
${x 
    p 
} 
' <input file> 

x开始 - 交换电流输入线与保持空间(x),那么第一行不打印任何东西(1d),后续行打印从货舱空间只是换行(p),在最后一行再次交换保留空间并打印它里面的内容($x{x p}。当我们点击目标行时(从/^xxxx/开始),将剩下的两行读入模式空间(n n)并将图案空间与保存空间交换(x) - 这会留下我们想要打印的下一行的保留空间以及匹配前的线条的图案空间,^h我们不希望,所以我们把它扔(d

+0

的进一步解释'x'命令,它用保持缓冲区“交换”模式空间:http://www.grymoire.com/Unix/Sed.html#uh-53 – 2009-05-21 00:20:38

+0

我无法运行上面的脚本。它说sed:FUNCTION/^ pattern/{n n x d} x 1d p $ {x p}不能解析不知道为什么? – 2013-08-07 19:36:13

0

这就是我将如何在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; 
} 

(未测试没有perl的这个系统上,请原谅任何过网站。)

-1
grep -v -f <(grep -1 "xxxx" file) file 
0

这可能为你工作(GNU SED):

echo -e "a\nyyyy\nxxxx\nzzzz\nb" | sed 'N;/^xxxx/M{/^xxxx/d;$!N;d};P;D' 
a 
b 

这样可保持两行的窗口模式空间和如果在第一行或第二行中找到所需的正则表达式,则读取以下行,然后删除所有三行。如果在第一行或最后一行中找不到前面/后面的行,则可以找到正则表达式。在这些情况下,只能删除两行。

顺便提一句,这个解决方案可能已经在GNU sed中发现了一个可能的bug。地址的M标志允许将^$元字符用作多行字符串中行的开始和结束的正则表达式中的零长度标记。空地址//重用先前陈述的地址。该地址是否应该包含多行标志?目前它似乎包括标志,即使它没有说明即

sed 'N;/^xxxx/M{/^xxxx/d;$!N;d};P;D' file 

产生不同的(正确的)导致给:

sed 'N;/^xxxx/M{//d;$!N;d};P;D' file 

xxxx如果出现在文件上的第二行。

0

您可以使用以下方法:

sed -n '/xxxx/{N;s/.*//;x;d;};x;p;${x;p;}' 

这将取代3线,一个空行。

0

可以先颠倒文件,使用sed删除匹配线和下一行(或线,+Ndsed命令),最后扭转结果返回:

tac old.file | sed -e '/xxxx/,+1d' | tac > new.file