删除包含模式的行和之前的行

xra*_*alf 3 sed

我想删除包含 pattern 的文件中的两行aaa bbb ccc

我使用了以下表达式,它删除了包含模式aaa bbb ccc的行和之前的行。

$ sed -n '/aaa bbb ccc/{s/.*//;x;d;};x;p;${x;p;}' file.txt | sed '/^$/d'
Run Code Online (Sandbox Code Playgroud)

这适用于一个文件。它不适用于多个文件

$ for i in *.txt; do sed -n '/aaa bbb ccc/{s/.*//;x;d;};x;p;${x;p;}' "$i" | sed '/^$/d'; done
Run Code Online (Sandbox Code Playgroud)

示例文件:

xxx
yyy
aaa bbb ccc
eee
fff
aaa bbb ccc
ggg
hhh
Run Code Online (Sandbox Code Playgroud)

结果文件:

xxx
eee
ggg
hhh
Run Code Online (Sandbox Code Playgroud)

don*_*sti 7

看起来您正在使用gnu sed- 在这种情况下,您可以执行以下操作

sed -s 'N;/PATTERN/!P;D' ./*.txt
Run Code Online (Sandbox Code Playgroud)

对于其他seds,您必须遍历文件列表

for file in ./*.txt
do
sed '$!N;/PATTERN/!P;D' "$file"
done
Run Code Online (Sandbox Code Playgroud)

这将始终在模式空间中保留两行,如果模式空间与输入不匹配,则打印第一行,例如

some line
PATTERN
PATTERN
more
lines
another line
PATTERN
Run Code Online (Sandbox Code Playgroud)

它会打印

more
lines
Run Code Online (Sandbox Code Playgroud)