GREP打印不匹配的空行



我想用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
  1. 第一行:行不匹配"这个"新";,删除所有留下空行的字符
  2. 第二个lnie:线条与图案相匹配,只保留"中间的";文本
    • 这是不是pcre非贪婪匹配:行
      This is new but that is not new
      
      将产生输出
      is new but that is not
      

要继续使用PCRE,请使用perl:

perl -lpe '$_ = /This(.*?)new/ ? $1 : ""' file

这可能对您有用:

sed -E 's/.*This(.*)new.*|.*/1/' file

如果进行了第一次匹配,则该行将被Thisnew之间的所有内容所替换。

否则,第二场比赛将删除所有内容。

注意:替换总是符合其中一个条件。Wiktor Stribiżew提出了解决方案。

最新更新