【发布时间】:2013-02-17 18:28:52
【问题描述】:
我正在尝试使用 sed 替换表达式。正则表达式在 vim 中有效,但在 sed 中无效。我用斜线替换数字前的最后一个破折号,所以
/www/file-name-1
应该返回
/www/file-name/1
我正在使用以下命令,但它一直在输出 /www/file-name/0
sed 's/-[0-9]/\/\0/g' input.txt
我做错了什么?
【问题讨论】:
我正在尝试使用 sed 替换表达式。正则表达式在 vim 中有效,但在 sed 中无效。我用斜线替换数字前的最后一个破折号,所以
/www/file-name-1
应该返回
/www/file-name/1
我正在使用以下命令,但它一直在输出 /www/file-name/0
sed 's/-[0-9]/\/\0/g' input.txt
我做错了什么?
【问题讨论】:
OS X 下的 sed 似乎从 1 开始计算反向引用。尝试使用 \1 而不是 \0
【讨论】:
-r,这意味着您需要转义括号。
您必须将数据括在括号中以便稍后引用它,并且sed 开始计数为 1。要恢复所有匹配的字符而不需要括号,使用 & 符号。
sed 's/-\([0-9]\)/\/\1/g' input.txt
产生:
/www/file-name/1
【讨论】:
您需要先使用括号进行捕获,然后才能反向引用(以\1 开头)。试试sed -r 's|(.*)-|\1/|':
$ sed -r 's|(.*)-|\1/|' <<< "/www/file-name-1"
/www/file-name/1
您可以将任何分隔符与sed 一起使用,因此当替换包含/ 时,/ 不是最佳选择。 -r 选项用于扩展正则表达式,因此不需要转义括号。
【讨论】: