Unix 如何删除匹配行和上一行?

Unix 如何删除匹配行和上一行?,unix,sed,grep,pattern-matching,Unix,Sed,Grep,Pattern Matching,我需要删除一个匹配的行和它前面的一个。 e、 在下面的文件中,我需要删除第1行和第2行 我尝试了“grep-v-b1”,共页.1.txt 我希望它不会打印匹配线和上下文 我尝试了sed,但无法理解sed的用法 ---1.txt-- **document 1** -> 1 **page 1 of 2** -> 2 testoing testing super crap blah **do

我需要删除一个匹配的行和它前面的一个。 e、 在下面的文件中,我需要删除第1行和第2行

我尝试了“grep-v-b1”,共页.1.txt 我希望它不会打印匹配线和上下文

我尝试了sed,但无法理解sed的用法

---1.txt--
**document 1**                         -> 1
**page 1 of 2**                        -> 2

testoing
testing

super crap blah

**document 1**
**page 2 of 2**

不太熟悉sed,但这里有一个perl表达式来实现这一点:

cat FILE | perl -e '@a = <STDIN>;
                    for( $i=0 ; $i <= $#a ; $i++ ) { 
                     if($i > 0 && $a[$i] =~ /xxxx/) { 
                       $a[$i] = ""; 
                       $a[$i-1] = "";
                     }
                    } print @a;'
cat文件| perl-e'@a=;
对于($i=0;$i0&&$a[$i]=~/xxxx/){
$a[$i]=”;
$a[$i-1]=“”;
}
}打印@a;'
编辑:


其中“xxxx”是您试图匹配的内容。

您希望执行与

作为一条线

sed -n '/page . of ./{n;x;d;};x;1d;p;${x;p;}' 1.txt

grep-v-B1
不起作用,因为它将跳过这些行,但稍后会包含这些行(由于
-B1
。要检查此问题,请尝试以下命令:

**document 1**                         -> 1
**page 1 of 2**                        -> 2

**document 1**
**page 2 of 2**
**page 3 of 2**
您会注意到,第2页的
行将被跳过,因为该行将不匹配,而下一行将不匹配

有一个简单的awk解决方案:

awk '!/page.*of.*/ { if (m) print buf; buf=$0; m=1} /page.*of.*/ {m=0}' 1.txt
awk命令说明如下:


如果当前行有“page…of”,那么它将表示您没有找到有效的行。如果您没有找到该字符串,那么您将打印上一行(存储在buf中),并将缓冲区重置为当前行(因此强制其延迟1)

grep-vf谢谢,我正在尝试使用
删除匹配行和上一行。我必须多次使用它,因此对于匹配的部分,我使用了一个变量。给定的awk命令有效,但使用变量时无效(即,它不会删除匹配的上一行)。我尝试了:


awk-vvar=“page.*of.*”!/$var/{if(m)print buf;buf=$0;m=1}/$var/{m=0}'1.txt

请注意,您可以在一行上完成:
sed-n'/page 1/{n;x;d;};x;1d;$G;p'1.txt
@Beta:当然,额外的行等只是注释为什么会被否决?它符合提问者的要求(并且是在sed引导中)当然,这个解决方案的某些部分可能会受到批评,但总体概念是可靠的,示例代码实现得相当好。它很容易理解。足以让人入门。这就是这里答案的全部要点。它不需要完美。我喜欢这个答案。它确实有帮助我遇到了一个与原始问题类似的问题。请尝试将
-x
选项添加到外部
grep
。这不是非常有效。
awk '!/page.*of.*/ { if (m) print buf; buf=$0; m=1} /page.*of.*/ {m=0}' 1.txt
grep -vf <(grep -B1 "page.*of" file | sed '/^--$/d') file