8

我正在尝试使用 sed 替换表达式。正则表达式在 vim 中有效,但在 sed 中无效。我用斜杠替换数字前的最后一个破折号,所以

/www/file-name-1 

应该返回

/www/file-name/1

我正在使用以下命令,但它一直输出 /www/file-name/0

sed 's/-[0-9]/\/\0/g' input.txt

我究竟做错了什么?

4

3 回答 3

15

您必须将数据括在括号之间以便稍后引用它,并sed从 1 开始计数。要恢复所有匹配的字符而不需要括号,使用&符号。

sed 's/-\([0-9]\)/\/\1/g' input.txt

这会产生:

/www/file-name/1
于 2013-03-03T17:49:05.357 回答
5

您需要先使用括号进行捕获,然后才能反向引用(以 a 开头\1。尝试sed -r 's|(.*)-|\1/|'

$ sed -r 's|(.*)-|\1/|' <<< "/www/file-name-1" 
/www/file-name/1

您可以使用任何分隔符,sed因此/当替换包含/. 该-r选项适用于扩展正则表达式,因此不需要转义括号。

于 2013-03-03T17:58:04.273 回答
0

OS X 下的 sed 似乎从 1 开始计算反向引用。尝试\1而不是\0

于 2013-03-03T17:39:02.797 回答