regex - sed组匹配

标签 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 

最佳答案

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

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/

相关文章:

Javascript 安全地使用用户正则表达式

php - preg_replace this : {{1}{2}{3}{. .}} -- 可能是一个简单的 PHP/preg_replace/RegEx 问题,但我真的很难过

python - 在字符串python中查找带有额外字符的名称

perl - 复制第一个空行之前的所有内容

bash - 根据 bash 中的模式对文件行进行排序

unix - 如何在 unix 上使用行号从文件中提取行?

regex - 通过正则表达式检查给定列表是否包含某些元素的最快和优雅的方法

linux - 使用 sed 删除一段文本

bash - 使用bash和sed如何从主机名命令中提取ip并将其保存在/etc/hosts文件中

regex - 使用正则表达式替换连续的重复模式