Regex 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中计数。要恢复所有匹配的字符而不需要括

我正在尝试使用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中计数。要恢复所有匹配的字符而不需要括号,可以使用
&
符号

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没有使用括号。大括号前的反斜杠不是必需的,是吗?