【问题标题】:Get all occurrences of the search pattern获取所有出现的搜索模式
【发布时间】:2011-03-30 00:55:52
【问题描述】:

我尝试从文件中获取所有出现的模式,但目前如果每行出现多次,我会失败。

文件中的示例行:

lorem ipsum foo="match1" lorem ipsum foo="match2" lorem ipsum

我想要的输出:

match1 match2

我尝试使用 sed 来获取它:

sed -ne 's/^.*foo="\([^"]*\)".*$/\1/p'

用这个表达式我只得到第一次出现,但我不知道如何使它更好。

【问题讨论】:

    标签: regex sed replace


    【解决方案1】:

    使用grep 而不是sed

    grep -o -P '(?<=foo=")[^"]*'
    

    【讨论】:

    • 请注意,这仅在您的 grep 恰好在编译时支持 -P(Perl 语法)选项时才有效。 Vanilla grep 不支持在 Perl 和 Perl 派生的正则表达式风格中发现的后向或任何其他 whizbang 功能。
    【解决方案2】:
    $ s="lorem ipsum foo="match1" lorem ipsum foo="match2" lorem ipsum"
    $ echo $s|tr "[ \t]" "\n"|awk -F"=" '$1=="foo"{print $2}'
    match1
    match2
    

    【讨论】:

      【解决方案3】:

      这表明您可能不想使用sed。它可以工作并且相当健壮,但在某些极端情况下可能会失败:

      sed -n 's/\(foo="[^"]*\)/\n\1\n/g;s/[^\n]*\n*foo="//g;s/\n"[^n]*$//p' file
      

      【讨论】:

        猜你喜欢
        • 2012-01-26
        • 2020-03-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-01
        • 2016-02-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多