Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex SED-如果匹配,在1行之前和2行之后移除_Regex_Awk_Sed - Fatal编程技术网

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
    -打印段落,除非其匹配
但是,如果需要从字面上取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命令在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