麻烦大神解释下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。求解答!!!
展开
 我来答
百度网友5311d79
2013-07-15 · TA获得超过1.9万个赞
知道大有可为答主
回答量:6356
采纳率:71%
帮助的人:3224万
展开全部

这个别人给的答案其实也是有问题的,虽然结果是正确的。

* 在正则表达式里表示重复前面一个字符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)/'
曾经英雄混混
2013-07-15 · TA获得超过259个赞
知道答主
回答量:185
采纳率:75%
帮助的人:110万
展开全部
holy crap! what the frig is this??
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式