Regex sed中的反向引用返回错误的值
我正在尝试使用sed替换表达式。正则表达式在vim中工作,但在sed中不工作。我用斜线代替数字前的最后一个破折号Regex sed中的反向引用返回错误的值,regex,macos,sed,Regex,Macos,Sed,我正在尝试使用sed替换表达式。正则表达式在vim中工作,但在sed中不工作。我用斜线代替数字前的最后一个破折号 /www/file-name-1 应该回来 /www/file-name/1 我正在使用以下命令,但它会继续输出/www/file name/0 sed 's/-[0-9]/\/\0/g' input.txt 我做错了什么?似乎OSX下的sed从1开始计算反向引用。尝试\1而不是\0您必须将数据括在括号中,以便稍后引用,并且sed开始在1中计数。要恢复所有匹配的字符而不需要括
/www/file-name-1
应该回来
/www/file-name/1
我正在使用以下命令,但它会继续输出/www/file name/0
sed 's/-[0-9]/\/\0/g' input.txt
我做错了什么?似乎OSX下的sed从1开始计算反向引用。尝试
\1
而不是\0
您必须将数据括在括号中,以便稍后引用,并且sed
开始在1中计数。要恢复所有匹配的字符而不需要括号,可以使用&
符号
sed 's/-\([0-9]\)/\/\1/g' input.txt
这将产生:
/www/file-name/1
您需要先使用括号捕获,然后才能返回引用(该引用开始于
\1
)。试试sed-r的|(.*)-|\1/|':
$ sed -r 's|(.*)-|\1/|' <<< "/www/file-name-1"
/www/file-name/1
$sed-r的|(.*)-|\1/|'如果我使用\1,它将返回“\1未在RE中定义”OS X/macOS具有古老的UNIX工具。您不能使用-r
,这意味着您需要对括号进行转义。OSX的sed使用-E而不是-r来启用扩展regext。这是正确的答案。我没有注意到@user2052491没有使用括号。大括号前的反斜杠不是必需的,是吗?