这可能是一个愚蠢的问题,但是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
答案 0 :(得分:3)
sed(以及其他使用Posix Basic正则表达式的实用程序)对(
和)
没有任何特殊含义,因此您可以像使用任何其他字符一样使用它们。 \(
和\)
是群组分隔符。
BRE真的应该死了。很久很久以前,Posix定义了“扩展”正则表达式(ERE),其中分组分隔符为(
和)
,您使用\(
和\)
来匹配括号,这更直观。 {
和}
(数字重复运算符)的BRE和ERE处理之间存在类似的差异。 ERE还包括|
和+
运营商。
grep
和sed
都默认使用BRE,但可以说服其使用具有正确命令行标记的ERE:grep -E
和sed -r
。 gawk使用带有一些GNU扩展的ERE和一些与标准的偏差,包括如果你想使用{
和}
必须指定--re-interval这一事实。 [咆哮]我们有时会惊讶于我们容忍所有这些疯狂。应该只有一个正则表达式标准,并且所有实用程序都应该使用它而没有例外。[/ rant]
如果您的(
和)
的正则表达式无法按预期工作,请提供失败的模式的具体示例以及您的预期结果。我怀疑它与你的模式中的空格字符有关,如果这实际上是你正在使用的模式。
答案 1 :(得分:2)
我认为你的问题首先是贪婪的匹配。*模式需要。
尝试用[^()] *替换它以排除括号:
bash$ echo 'xxx(123)yyy' | sed -e 's/[^()]*(\([[:alnum:]]*\))[^()]*/\1/' ->
123