sed:区域后跟数字

时间:2012-03-19 11:08:34

标签: regex sed escaping

考虑以下一行:

install --with-some-params some_pkg_name.10000
install --with-some-params other_pkg_name.10000
install --with-some-params yet_other_pkg_name.10000

我正在尝试更改文件,以便安装some_pkg_name的每一行都会升级到另一个版本 - 比如10001。我试过了:

sed 's/\(install --with-some-params some_pkg_name\.\)\([0-9]\{5\}\)/\1 10001/g'

这确实匹配了右边的行,但进入了一个不必要的空间:

install --with-some-params some_pkg_name. 10001
                                         ^
install --with-some-params other_pkg_name.10000
install --with-some-params yet_other_pkg_name.10000

但如果我省略了正则表达式中的空格,它会匹配区域\110001,而不是\1,后跟10001

有没有办法从1中分离10001,而不在输出中添加空格?

3 个答案:

答案 0 :(得分:2)

一种可能的解决方法是从群组中移出点:

sed 's/\(install --with-some-params some_pkg_name\)\.\([0-9]\{5\}\)/\1.10001/g'

答案 1 :(得分:1)

我会建议使用其他工具的解决方案,以类似的方式执行这些任务,但功能更强大,perl

perl -pe 's/(install --with-some-params some_pkg_name\.)(\d{5})/$1 . ($2+1)/e' infile

结果:

install --with-some-params some_pkg_name.10001
install --with-some-params other_pkg_name.10000
install --with-some-params yet_other_pkg_name.10000

/e标志可让您评估替换部件,将数字版本增加为一个。

答案 2 :(得分:-1)

另一个解决方案是将您要替换的内容放在单引号中,这样:

sed 's/\(install --with-some-params some_pkg_name\.\)\([0-9]\{5\}\)/\1'10001'/g'