我正在尝试使用 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
最佳答案
如果您知道参数的数量并且它们总是“简单”的(没有嵌套括号,因此也没有嵌入逗号),那么:
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\}
来查找第一个参数之后的参数。
关于regex - sed组匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8465416/