我正在尝试使用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
答案 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:]]
(扩展正则表达式选项)。