簡體   English   中英

SED - 如果匹配,則刪除前 1 行和后 2 行

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM