SED-如果匹配,则在1行之前和2行之后删除



我有以下数据

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
$ 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='nn' '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 !/WryeW/i' input.txt
https://link3.com
8iqiwudhuiqhwdqwuidhuiqhwi SOMETHING ELSE  iqwdihqwuidhuiqwhduihqwi
https://link3.com/image.jpg
$42.99
  • -00启用段落模式
  • 默认情况下-n不打印记录
  • 'print if !/WryeW/i-打印段落,除非匹配

但是,如果需要从字面上取前1行和后3行:

$ perl -0777 -pe 's/.*n.*WryeW.*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行结尾。

或者,您可以使用Perl来完成这样的任务:

$ perl -i -pe 'BEGIN{undef $/;} s/.*?n.*rye.*?n(^.*?n){3}///mig' input.txt
$ sed -e "/${exclude}/I,+2d" -i /path/to/file

然后我很容易删除前一行

最新更新