【问题标题】:How to display text between nested Parenthesis using sed or awk or grep?如何使用 sed 或 awk 或 grep 在嵌套括号之间显示文本?
【发布时间】:2014-02-05 11:41:38
【问题描述】:

我有一个文件,其中一行包含嵌套括号,我只想显示这些单词。

例子:

(abc (defg) or hij(klmn)) and (opq(rstuv))

预期结果:

defg
klmn
rstuv

我已经尝试过 awk - awk -F "[(())]" '{ for (i=2; i<NF; i+=2) print $i}'

我已尝试使用 sed - sed 's/.*(\([a-zA-Z0-9_]*\)).*/\1/'

【问题讨论】:

    标签: sed awk grep


    【解决方案1】:

    使用 perl 全局匹配和惰性量词:

    #! /usr/bin/perl -n
    
    use feature 'say';
    
    while (/\((.*?\)[^(]*?)\)/g) {
        $m=$1;
        while ($m =~ /\((.*?)\)/g) {
           say $1;
        }
    }
    

    输出:

    defg
    klmn
    rstuv
    

    【讨论】:

      【解决方案2】:

      也许grep

      $ echo "(abc (defg) or hij(klmn)) and (opq(rstuv))" | grep -o "([a-z]*)"
      (defg)
      (klmn)
      (rstuv)
      

      它捕获( + letters + ) 的组。

      我试图摆脱括号但不能。这是我的方法:

      grep -Po '(?<=()[a-z]*(?=))'
      

      但它表明“grep:lookbehind assertion is not fixed length”,因为我猜它无法决定要查找哪个)

      【讨论】:

      • echo "(abc (defg) or hij(klmn)) and (opq(rstuv))" | grep -Po '(?&lt;=\()[a-z]*(?=\))'
      • 我们不知道 () 中的内容,可能不仅仅是字母。将[a-z]替换为[^(|)]
      【解决方案3】:

      这可能对你有用(GNU sed):

      sed -r 's/\(([^()]*)\)/\n\1\n/;s/[^\n]*\n//;/[^()]/P;D' file
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-07-28
        • 2013-11-10
        • 2018-08-08
        • 2017-12-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多