1

这可能是一个愚蠢的问题,但( )sed 支持?我知道\\(\\)持有它们之间的内容,因此您可以通过\1或任何数字访问它。我需要一个正则表达式来查找括号并保存它们之间的内容。

sed 's/.*( .* \([[:alnum:]]+\) *).*/\1/' file

所以我正在寻找这个:

可能是一些东西(可能是一些东西 [字母或数字] 可能是一些东西)

我需要找到外部()s,但你不能找到\它们,否则它认为你想保存里面的东西。基本上我只需要找到()s 就可以在其中保存一些东西。

我将继续寻找如何做到这一点,但如果你们中的任何人知道它会如何真正帮助我。我尝试使用""and '',除非我使用了某种不起作用的不正确语法。感谢您提供任何帮助。

编辑:具体示例:我想要:

    aname = (type name){ value, value }. 

我想知道如何在 sed 中专门寻找 ()s 和 {},因为它们还有其他含义。我假设 \{ 和 \} 是您获得 {} 的方式,但我不确定如何获得 ()。我也知道前面的 sed 表达式不会找到,这只是我写下的一个简单示例,以表明我想在正则表达式中查找 ()。如果我造成任何混乱,我很抱歉。只是让你们可以看到这是我当前的正则表达式:

    start line   aname        =          (        type           name    )         { values }; 

    sed 's/^\([[:alnum:]]\)+ *={1} *[^()]({1} *[[:alnum:]]+ +\([[:alnum:]]\)+ *) *\{{1}\(.*\)\};/init_\2\( \&\1, \3)/' file
4

2 回答 2

3

sed(和其他使用 Posix 基本正则表达式的实用程序)没有赋予任何特殊含义()因此您可以像使用任何其他字符一样使用它们。\(并且\)是组分隔符。

BRE真的应该死。很久很久以前,Posix 定义了“扩展”正则表达式 (ERE),其中分组分隔符是(and)并且您使用\(and\)来匹配括号,这更加直观。{BRE 和 ERE 处理和}(数字重复运算符)之间存在类似的差异。ERE 还包括|and+运算符。

grep并且sed两者都默认使用 BRE,但可以说服使用带有正确命令行标志的 ERE:grep -Esed -r. gawk 使用带有一些 GNU 扩展和一些与标准的偏差的 ERE,包括如果你想使用{and必须指定 --re-interval 的事实}。[咆哮]有时让我感到惊讶的是,我们容忍所有这些精神错乱。应该只有一个正则表达式标准,所有实用程序都应该毫无例外地使用它。[/rant]

如果您的正则表达式使用(并且)未按预期工作,请提供其失败的模式的具体示例以及您的预期结果。我的怀疑是它与您的模式中的空格字符有关,如果这实际上是您正在使用的模式。

于 2012-09-25T17:33:08.810 回答
2

我认为您的问题是第一个 .* 模式采用的贪婪匹配。

尝试用 [^()]* 替换它以排除括号:

bash$ echo 'xxx(123)yyy' | sed -e 's/[^()]*(\([[:alnum:]]*\))[^()]*/\1/' ->
123
于 2012-09-25T16:28:21.723 回答