麻烦大神解释下shell 标签的问题
前断时间在网上问别人一个问题,别人给了我一个答案,可以达到目的。但是无法理解。求大神解释。echo"memcpy_(arg1,arg2,len)"|sed-r's/mem...
前断时间在网上问别人一个问题,别人给了我一个答案,可以达到目的。但是无法理解。求大神解释。
echo "memcpy_(arg1,arg2,len)" | sed -r 's/memcpy_\(*(\w+),*(\w+),*(\w+)\)/_Memcpy_\(\1,\3,\2,\3\)/'---------------------其中(*(\w+),*(\w+),*(\w+)\)中的*号怎么理解?
我自己写的为什么就不行呢?写法如下。
echo "memcpy_(arg1,arg2,len)" | sed -r 's/_memcpy_\(\(.*\),\(.*\),\(.*\)\)/_memcpy(\1,\3,\2,\3)/'
sed: -e expression #1, char 56: invalid reference \3 on `s' command's RHS。求解答!!! 展开
echo "memcpy_(arg1,arg2,len)" | sed -r 's/memcpy_\(*(\w+),*(\w+),*(\w+)\)/_Memcpy_\(\1,\3,\2,\3\)/'---------------------其中(*(\w+),*(\w+),*(\w+)\)中的*号怎么理解?
我自己写的为什么就不行呢?写法如下。
echo "memcpy_(arg1,arg2,len)" | sed -r 's/_memcpy_\(\(.*\),\(.*\),\(.*\)\)/_memcpy(\1,\3,\2,\3)/'
sed: -e expression #1, char 56: invalid reference \3 on `s' command's RHS。求解答!!! 展开
2个回答
展开全部
这个别人给的答案其实也是有问题的,虽然结果是正确的。
* 在正则表达式里表示重复前面一个字符0次或多次,但这里*前面是括号或逗号,显然是不需要重复的。下面这样就行:
echo "memcpy_(arg1,arg2,len)" | sed -r 's/memcpy_\((\w+),(\w+),(\w+)\)/_Memcpy_\(\1,\3,\2,\3\)/'
你自己写的之所以不行,是因为两点:
1)sed中第一个memcpy前面多了个_号,所以匹配不上。
2)你在用了-r选项的同时用了\( \)来表示组。
加了-r选项,即支持扩展的正则,就可以直接用 ( ) 来表示sed中的组。而真正的字符串中的( ) 才要加转义符。
改为:
echo "memcpy_(arg1,arg2,len)" | sed 's/memcpy_(\(.*\),\(.*\),\(.*\))/_memcpy(\1,\3,\2,\3)/'
或者加-r选项:
echo "memcpy_(arg1,arg2,len)" | sed -r 's/memcpy_\((.*),(.*),(.*)\)/_memcpy(\1,\3,\2,\3)/'
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询