Regex SED-如果匹配,在1行之前和2行之后移除
我有以下数据Regex SED-如果匹配,在1行之前和2行之后移除,regex,awk,sed,Regex,Awk,Sed,我有以下数据 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 8iqiwudhuiqhwdqwuidhuiq
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
或者,您可以将Perl用于如下作业:
$ perl -i -pe 'BEGIN{undef $/;} s/.*?\n.*rye.*?\n(^.*?\n){3}///mig' input.txt
或者,如果您可以输出多个文本块,并希望每个文本块之间用一个空行分隔:
$ 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
$sed-e/${exclude}/I,+2d“-I/path/to/file
然后我很容易地删除了第行之前的内容,每一个其他答案都假设前面的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
-打印段落,除非其匹配“如果需要打印/\Wrye\W/i
$ 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命令在case-sensitive>sed/${exclude}/,+2d“-I/tmp/all>sed'/${exclude2}/{$!N;/\N.*${exclude2}:/!p;D}'-I/tmp/所有这些都与awk
很简单。你试过了吗?我还没试过。我将向您显示我的命令,只要1分钟您的意思是您需要不区分大小写的匹配。或“不区分大小写”。在区分大小写的匹配中,“rye”与“rye”不匹配,我认为您将有错误的匹配,因为您没有将其约束到第二个字段。OP也没有问,但基于所暗示的示例。除了子字符串raye
(虽然很小)的更改之外,您不想将单词边界包括在内吗?不要这样做。它很脆弱(对于exclude
的各种值和各种输入文件内容都会失败)、不完整,并且您会注意到,没有人知道sed以及其他工具建议您使用sed。它甚至在匹配模式之前都不会删除行。仍然\r?
是不必要的-
已经匹配了它。此外,在本例中不需要/m
,因为在本例中也不需要^。此外,“它有用吗”并不总是与“它错了吗”相反
$ perl -00 -ne 'print if !/\Wrye\W/i' input.txt
https://link3.com
8iqiwudhuiqhwdqwuidhuiqhwi SOMETHING ELSE iqwdihqwuidhuiqwhduihqwi
https://link3.com/image.jpg
$42.99
$ 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