【问题标题】:bash sed/grep extract text between 2 wordsbash sed/grep 提取两个单词之间的文本
【发布时间】:2014-01-26 20:42:45
【问题描述】:

我的问题和这里一样,除了我只想要第一次出现,其余的忽略:

How to use sed/grep to extract text between two words?

在他的例子中,如果是这样的话:

 input: "Here is a String Here is a String"

但我只关心第一个“是”

echo "Here is a String Here is a String" | grep -Po '(?<=(Here )).*(?= String)' 

输出:"is a String Here is a"

这甚至可以用 grep 实现吗?我也可以使用 sed 来完成这项工作。

谢谢

【问题讨论】:

  • 如果要查找包含模式的行,请使用grep -- 或egrep。如果要查找包含模式的行,然后在打印结果之前以某种方式对其进行转换,请使用sed

标签: regex linux bash sed


【解决方案1】:

您的正则表达式恰好与位于“Here”和“String”之间的最长字符串匹配。也就是说,确实,“Here is a String Here is a String”。这是* 量词的默认行为。

$ echo "Here is a String Here is a String" | grep -Po '(?<=(Here )).*(?= String)'
is a String Here is a

如果你想匹配最短的,你可以在* 量词后面加上一个?(贪婪修饰符):

$ echo "Here is a String Here is a String" | grep -Po '(?<=(Here )).*?(?= String)'
is a
is a

【讨论】:

    【解决方案2】:

    要获取第一个单词,您可以使用grep -o '^[^ ]*'

    echo "Here is a String Here is a String" | grep -Po '(?<=(Here )).*(?= String)' | grep -o '^[^ ]*'
    

    您可以多次通过管道 grep 到 grep 将简单的命令组合成复杂的命令。

    【讨论】:

      【解决方案3】:
      sed 's/ String.*//;s/.*Here //'
      

      【讨论】:

        猜你喜欢
        • 2012-10-25
        • 1970-01-01
        • 1970-01-01
        • 2014-10-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-14
        相关资源
        最近更新 更多