![刪除包含模式的行以及[重複]之前的行](https://rvso.com/image/112061/%E5%88%AA%E9%99%A4%E5%8C%85%E5%90%AB%E6%A8%A1%E5%BC%8F%E7%9A%84%E8%A1%8C%E4%BB%A5%E5%8F%8A%5B%E9%87%8D%E8%A4%87%5D%E4%B9%8B%E5%89%8D%E7%9A%84%E8%A1%8C.png)
我想刪除文件中包含 pattern 的兩行aaa bbb ccc
。
我使用了以下表達式,它刪除了包含模式的行aaa bbb ccc
和之前的行。
$ sed -n '/aaa bbb ccc/{s/.*//;x;d;};x;p;${x;p;}' file.txt | sed '/^$/d'
這適用於一個文件。它不適用於多個文件
$ for i in *.txt; do sed -n '/aaa bbb ccc/{s/.*//;x;d;};x;p;${x;p;}' "$i" | sed '/^$/d'; done
範例檔:
xxx
yyy
aaa bbb ccc
eee
fff
aaa bbb ccc
ggg
hhh
結果文件:
xxx
eee
ggg
hhh
答案1
看起來你正在使用gnu sed
- 在這種情況下你可以做類似的事情
sed -s 'N;/PATTERN/!P;D' ./*.txt
對於其他sed
s,您必須循環遍歷文件列表
for file in ./*.txt
do
sed '$!N;/PATTERN/!P;D' "$file"
done
這將始終在模式空間中保留兩行,並在模式空間不匹配時列印第一行,因此輸入如下
some line
PATTERN
PATTERN
more
lines
another line
PATTERN
它會列印
more
lines