如何使用sed或awk或grep在嵌套的括号之间显示文本?

时间:2014-02-05 11:41:39

标签: sed awk grep

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

示例:

(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/'

3 个答案:

答案 0 :(得分:0)

也许使用grep

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

它会抓取( + letters + )的群组。

我试图摆脱这种副作用但不能。这是我的方法:

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

但它表明“grep:lookbehind断言不是固定长度”,因为我猜它无法决定要查找的)

答案 1 :(得分:0)

这可能适合你(GNU sed):

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

答案 2 :(得分:0)

使用perl全局匹配和延迟量词:

#! /usr/bin/perl -n

use feature 'say';

while (/\((.*?\)[^(]*?)\)/g) {
    $m=$1;
    while ($m =~ /\((.*?)\)/g) {
       say $1;
    }
}

输出:

defg
klmn
rstuv