[英]SED - remove before 1 and after 2 lines if match
我有以下數據
https://link1.com
asndiaiusdias Rye ioajsidsauihduiashd
link1.com/image.jpg
$89.99
https://link2.com
8iqiwudhuiqhwdqwuidhuiqhwi Rye iqwdihqwuidhuiqwhduihqwi
https://link2.com/image.jpg
$22.99
https://link3.com
8iqiwudhuiqhwdqwuidhuiqhwi SOMETHING ELSE iqwdihqwuidhuiqwhduihqwi
https://link3.com/image.jpg
$42.99
https://link4.com
iashduhuasdi rye huiqwheui
https://link4.com/image.jpg
$232.99
我的目標是區分大小寫匹配“Rye”(也是 rye 或 RYe 或 rYe)並刪除匹配前的 1 行和匹配后的 3 行
所以結果應該是:
https://link3.com
8iqiwudhuiqhwdqwuidhuiqhwi SOMETHING ELSE iqwdihqwuidhuiqwhduihqwi
https://link3.com/image.jpg
$42.99
你可以使用 sed,grep,awk 不需要只使用 sed,只需要工作
您可以將此awk
與空RS
:
awk -v RS= '$3 !~ /^[rR][yY][eE]$/' file
https://link3.com
8iqiwudhuiqhwdqwuidhuiqhwi SOMETHING ELSE iqwdihqwuidhuiqwhduihqwi
https://link3.com/image.jpg
$42.99
或者,您可以將 Perl 用於這樣的工作:
$ perl -i -pe 'BEGIN{undef $/;} s/.*?\n.*rye.*?\n(^.*?\n){3}///mig' input.txt
$ awk -v RS= 'tolower($3) != "rye"' file
https://link3.com
8iqiwudhuiqhwdqwuidhuiqhwi SOMETHING ELSE iqwdihqwuidhuiqwhduihqwi
https://link3.com/image.jpg
$42.99
或者如果您可以有多個文本輸出塊並希望它們每個都由一個空行分隔:
$ awk -v RS= -v ORS='\n\n' 'tolower($3) != "rye"' file
https://link3.com
8iqiwudhuiqhwdqwuidhuiqhwi SOMETHING ELSE iqwdihqwuidhuiqwhduihqwi
https://link3.com/image.jpg
$42.99
所有其他答案都假設前 1 行和后 3 行實際上表示段落:
$ perl -00 -ne 'print if !/\Wrye\W/i' input.txt
https://link3.com
8iqiwudhuiqhwdqwuidhuiqhwi SOMETHING ELSE iqwdihqwuidhuiqwhduihqwi
https://link3.com/image.jpg
$42.99
-00
啟用段落模式-n
默認不打印記錄'print if !/\\Wrye\\W/i
- 打印一個段落,除非它匹配但是,如果需要從字面上理解之前的 1 行和之后的 3 行:
$ perl -0777 -pe 's/.*\n.*\Wrye\W.*\n(.*\n){3}//ig' input.txt
https://link3.com
8iqiwudhuiqhwdqwuidhuiqhwi SOMETHING ELSE iqwdihqwuidhuiqwhduihqwi
https://link3.com/image.jpg
$42.99
-0777
讀取整個文件-p
打印.*\\n
- 匹配包括行尾的一行(注意沒有/s
.
不匹配\\n
) 注意:有人在評論中提出了 dos 兼容性問題。 “。” 匹配除換行符之外的任何字符,其中包括\\r
,因此.*\\n
也涵蓋 dos 行結尾。
$ sed -e "/${exclude}/I,+2d" -i /path/to/file
然后我輕松地在行前刪除
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.