我想用GREP提取两个模式之间的字符串,但当找不到匹配时,我想打印一个空行。
输入
This is very new
This is quite old
This is not so new
期望输出
is very
is not so
我尝试过:
grep-o-p'(?<=这个(。*?(?=新('
但这并没有保留上述示例中的第二个空行。我找了一个多小时,尝试了一些东西,但都没有结果。
如果在SED中使用解决方案更容易的话,我会很高兴的!
您可以使用
#!/bin/bash
s='This is very new
This is quite old
This is not so new'
sed -En 's/.*This(.*)new.*|.*/1/p' <<< "$s"
查看产生的在线演示
is very
is not so
详细信息:
E
-启用POSIX ERE regex语法n
-抑制默认线路输出s/.*This(.*)new.*|.*/1/
-查找任何文本、This
、任何文本(捕获到组1、1
中,然后再次查找任何文本,或整个字符串(在sed
中,行(,并替换为组1值p
-打印替换的结果
这就是您实际数据所需的:
sed -En 's/.*"user_ip":"([^"]*).*|.*/1/p'
请参阅此在线演示。[^"]*
匹配除"
字符之外的零个或多个字符。
使用您显示的示例,请尝试以下awk
代码。
awk -F'This\s+|\s+new' 'NF==3{print $2;next} NF!=3{print ""}' Input_file
OR
awk -F'This\s+|\s+new' 'NF==3{print $2;next} {print ""}' Input_file
解释:简单的解释是,将This\s+
或\s+new
设置为Input_file所有行的字段分隔符。然后在主程序检查条件下,如果NF(字段数(为3,则打印第二个字段(其中next
将把光标移到下一行(。在另一个条件下,如果NF
(字段数(不等于3
,则只需打印一行空行。
sed:
sed -E '
/This.*new/! s/.*//
s/.*This(.*)new.*/1/
' file
- 第一行:行不匹配"这个"新";,删除所有留下空行的字符
- 第二个lnie:线条与图案相匹配,只保留"中间的";文本
- 这是不是pcre非贪婪匹配:行
将产生输出This is new but that is not new
is new but that is not
- 这是不是pcre非贪婪匹配:行
要继续使用PCRE,请使用perl:
perl -lpe '$_ = /This(.*?)new/ ? $1 : ""' file
这可能对您有用:
sed -E 's/.*This(.*)new.*|.*/1/' file
如果进行了第一次匹配,则该行将被This
和new
之间的所有内容所替换。
否则,第二场比赛将删除所有内容。
注意:替换总是符合其中一个条件。Wiktor Stribiżew提出了解决方案。