Bash 是否删除匹配字符串的前一行?

Bash 是否删除匹配字符串的前一行?,bash,sed,Bash,Sed,如何删除匹配模式的前一行 或 与之相反的是: sed -n '/pattern/{g;1!p;};h' 使用tac | sed | tac(Linux/Solaris)然后是匹配模式后的下一行:)对于搜索表达式周围的“相对复杂”导航,可能是一个很好的解决方案(注释不是命令的一部分): 这将起作用,但仅当行数大于1且模式不在最后一行时才起作用 sed -n '/pattern/ { h; b }; 1 { h; b }; ${ H }; x; p' file 最好改用awk: awk '!/p

如何删除匹配模式的前一行

与之相反的是:

sed -n '/pattern/{g;1!p;};h'

使用
tac | sed | tac
(Linux/Solaris)然后是匹配模式后的下一行:)

对于搜索表达式周围的“相对复杂”导航,可能是一个很好的解决方案(注释不是命令的一部分):


这将起作用,但仅当行数大于1且模式不在最后一行时才起作用

sed -n '/pattern/ { h; b }; 1 { h; b }; ${ H }; x; p' file
最好改用
awk

awk '!/pattern/ && NR > 1 { print p } { p = $0 } END { if (NR) print p }' file

您可以还原文件,然后删除匹配模式后的行(这很简单),然后还原结果,下面是代码:

tail -r|sed '/pattern/{n;d;}'|tail -r

sed是一个很好的工具,用于在一行上进行简单替换,对于任何其他内容,只需使用awk:

$ cat file
here is a
a bad line before
a good line
in a file

$ awk 'NR==FNR{if (/good/) del[NR-1]; next} !(FNR in del)' file file
here is a
a good line
in a file
您可以使用上述习惯用法删除给定模式之前和/或之后任意数量的行,例如,删除给定目标之前的3行和之后的2行:

$ cat file
-5
-4
-3
-2
-1
target
+1
+2
+3
+4
+5
$
$ awk 'NR==FNR{if (/target/) for (i=-3;i<=2;i++) del[NR+i]; next} !(FNR in del)' file file
-5
-4
+3
+4
+5
$cat文件
-5
-4
-3
-2
-1
目标
+1
+2
+3
+4
+5
$

$awk'NR==FNR{if(/target/)for(i=-3;i这里是另一个
awk

awk '/pattern/ {f=1} !f&&NR>1 {print p} {p=$0;f=0} END {print p}' file

A
tac awk
版本:

tac file | awk '1; /pattern/ {getline}' | tac
PS
getline
通常应该避免,因为它有许多陷阱,因此:

tac file | awk '!p||NR!=p+1; /pattern/ {p=NR}' | tac
这可能适用于您(GNU-sed):


保持一个由两行组成的窗口,测试其中第二行的模式。如果有模式,不要打印第一行。

是否可以接受
awk
?如果可以,请添加标签。如果我们匹配了一个连续模式,则标签无效。@KanjiViroja是的,可以进行连续行匹配,但这不再是原始目标的一部分e主题。说到这一点,不清楚OP希望它表现如何。@KanjiViroja我可能错过了一个边缘案例。请在
zsh
中显示您的测试案例,bash没有
r
标记用于
tail
。我使用debian。什么是
文件
?为什么两次?这是一种两次通过的方法,所以它会将文件读取一次到ide识别目标线,然后第二次移除它们。
awk '/pattern/ {f=1} !f&&NR>1 {print p} {p=$0;f=0} END {print p}' file
tac file | awk '1; /pattern/ {getline}' | tac
tac file | awk '!p||NR!=p+1; /pattern/ {p=NR}' | tac
 sed '$!N;/\n.*pattern/!P;D' file