考虑以下一行:
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
,而不在输出中添加空格?
答案 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'