我有以下数据
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
然后我很容易删除前一行