sed组匹配

时间:2011-12-11 16:11:44

标签: regex sed

我正在尝试使用sed进行一些组匹配。

基本上我有类似的东西:

func_name(4234,43543,76,1)

我需要匹配函数的参数:

$ echo 'func_name(4234,43543,76,1)' | sed -n 's/\([0-9][0-9]*\).*/\1 /p' 
func_name(4234 

$ echo 'func_name(4234,43543,76,1)' | sed -n 's/\([[:digit:]]+\).*/\1 /p'
<empty>

$  echo 'func_name(4234,43543,76,1)'| sed -n 's/.*\([0-9][0-9]*\).*/\1 /p' 
1 

4 个答案:

答案 0 :(得分:6)

如果您知道参数的数量并且它们总是“简单”(没有嵌套的括号,因此也没有嵌入的逗号),那么:

echo "func_name(4234,53543,76,1)" |
sed 's/.*(\([^,)]*\),\([^,)]*\),\([^,)]*\),\([^,)]*\))/a1 \1; a2 = \2; a3 = \3; a4 = \4/'

请注意,这可以容忍逗号之后的空格(在它们之前也是如此 - 但是之前你不会留空格,不是吗?)。

或者,如果参数是简单的无符号整数,并且您知道函数名称,则可能:

echo "func_name(4234,53543,76,1)" |
sed 's/func_name(\([0-9]*\), *\([0-9]*\), *\([0-9]*\), *\([0-9]*\))/a1 \1; a2 = \2; a3 = \3; a4 = \4/'

要在单个匹配中获取所有参数,您必须执行嵌套分组:

echo "func_name(4234,53543,76,1)" |
sed 's/func_name(\(\([0-9]*\), *\([0-9]*\), *\([0-9]*\), *\([0-9]*\)\))/args = \1/'

现在\2 .. \5仍然引用单独的参数。

echo "func_name(4234,53543,76,1)" |
sed 's/func_name(\(\([0-9]*\)\(, *\([0-9]*\)\)\{3\}\))/args = \1/'

这使用重复控件\{3\}来查找第一个之后的参数。

答案 1 :(得分:1)

echo 'func_name(4234,43543,76,1)' | cut -d "(" -f2 | sed 's/[,)]/ /g'

答案 2 :(得分:1)

这可能对您有用:

echo 'func_name(4234,43543,76,1)' | sed 's/[^0-9,]//g;y/,/ /'
4234 43543 76 1

或者更详细地说:

echo 'func_name(4234,43543,76,1)' | 
sed 'h;s/[^0-9,]//g;y/,/\n/;x;s/(.*/ parameters are:/;G'
func_name parameters are:
4234
43543
76
1

答案 3 :(得分:-1)

如果要使用-r字符类,请使用选项[[:digit:]](扩展正则表达式选项)。

相关问题