试图寻找“(”in sed

时间:2012-09-25 16:20:48

标签: regex unix sed

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

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

所以我在找这个:

  

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

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

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

编辑:具体示例:我想:

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

我想知道如何在sed中专门查找()s和{}因为它们有其他含义。我假设\ {和\}是你如何得到{}但我不知道怎么得到()s。另外我知道以前的sed表达式找不到它,这只是我写下来的一个简单例子,以表明我想在正则表达式中寻找()。如果我引起任何混淆,我很抱歉。所以你们可以看到这是我现在的正则表达式:

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

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

2 个答案:

答案 0 :(得分:3)

sed(以及其他使用Posix Basic正则表达式的实用程序)对()没有任何特殊含义,因此您可以像使用任何其他字符一样使用它们。 \(\)是群组分隔符。

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

grepsed都默认使用BRE,但可以说服其使用具有正确命令行标记的ERE:grep -Esed -r。 gawk使用带有一些GNU扩展的ERE和一些与标准的偏差,包括如果你想使用{}必须指定--re-interval这一事实。 [咆哮]我们有时会惊讶于我们容忍所有这些疯狂。应该只有一个正则表达式标准,并且所有实用程序都应该使用它而没有例外。[/ rant]

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

答案 1 :(得分:2)

我认为你的问题首先是贪婪的匹配。*模式需要。

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

bash$ echo 'xxx(123)yyy' | sed -e 's/[^()]*(\([[:alnum:]]*\))[^()]*/\1/' ->
123