【问题标题】:GREP Print Blank Lines For Non-MatchesGREP 打印不匹配的空白行
【发布时间】:2022-01-11 20:43:37
【问题描述】:

我想用 GREP 提取两个模式之间的字符串,但是当没有找到匹配时,我想打印一个空行来代替。

输入

This is very new
This is quite old
This is not so new

期望的输出

 is very 

 is not so 

我尝试过:

grep -o -P '(?

但这并没有保留上例中的第二个空行。搜索了一个多小时,尝试了一些东西,但没有任何结果。

如果这更简单,我会很乐意在 SED 中使用解决方案!

【问题讨论】:

  • 如果字符串中没有email,为什么还要使用email
  • 抱歉,我在这里给出的示例与我正在尝试的实时命令之间存在差异。现在将修改...
  • 但是如果你需要处理双引号,你可能会遇到问题。请尽量不要过度简化您拥有的内容。
  • 我正在努力解决的主要问题是为不匹配保留一个空白行。提供一个清楚说明场景的示例输入似乎更好,但我会在未来考虑您的建议。
  • 那么,问题解决了吗,还是需要更多帮助?

标签: sed grep


【解决方案1】:

你可以使用

#!/bin/bash
s='This is very new
This is quite old
This is not so new'
sed -En 's/.*This(.*)new.*|.*/\1/p' <<< "$s"

查看online demo 产量

 is very 

 is not so 

详情

  • E - 启用 POSIX ERE 正则表达式语法
  • n - 禁止默认行输出
  • s/.*This(.*)new.*|.*/\1/ - 查找任何文本、This、任何文本(捕获到第 1 组 \1,然后再次找到任何文本,或整个字符串(在 sed 行中),并替换为第 1 组值。
  • p - 打印替换结果。

这就是您需要的实际数据:

sed -En 's/.*"user_ip":"([^"]*).*|.*/\1/p'

this online demo[^"]* 匹配除 " 字符之外的零个或多个字符。

【讨论】:

  • 由于交替总是匹配的,是否需要-n 选项和p 标志?
  • @potong 我已经优化了两次,我们当然可以继续删除多余的。
【解决方案2】:

使用您展示的示例,请尝试关注awk 代码。

awk -F'This\\s+|\\s+new' 'NF==3{print $2;next} NF!=3{print ""}' Input_file

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,然后简单地打印一个空行。

【讨论】:

    【解决方案3】:

    sed:

    sed -E '
        /This.*new/! s/.*//
        s/.*This(.*)new.*/\1/
    ' file
    
    1. 第一行:与“This.*new”匹配的行,删除所有字符,留下一个空行
    2. second lnie:匹配模式的行,只保留“中间”文本
      • 这是不是 pcre 非贪婪匹配:该行
        This is new but that is not new
        
        将产生输出
         is new but that is not
        

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

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

    【讨论】:

      【解决方案4】:

      这可能对你有用:

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

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

      否则第二个匹配将删除所有内容。

      注意替换将始终匹配其中一个条件。该解决方案由 Wiktor Stribiżew 提出。

      【讨论】:

        最近更新 更多