是否可以在 sed 中操作 & 符号?我想为文件中的所有数字添加 +1。像这样的东西:
sed -i "s/[0-9]\{1,2\}/$(expr & + 1)/g" filename
编辑:今天我使用 grep 和 sed 创建了一个循环来完成所需的工作。但是,如果有人知道操纵 & 符号的方法,这个问题仍然悬而未决,因为这不是我第一次想在替换字符串上运行命令,并且 can't。
您可以使用e
修饰符来实现这一点:
$ cat test.txt
1
2
$ sed 's/^[0-9]\{1,2\}$/expr & + 1/e' test.txt
2
3
在这种情况下,您应该在替换部分构造命令,该命令将被执行,结果将用于替换。
sed 需要在每一行上输入一些 shell 命令(带有'!')才能做到这一点。
在这里,您认为您正在调用 sed,然后它会回调到 shell 以评估$(expr & + 1)
每一行,但实际上并非如此。$(expr & + 1)
只会被外壳静态评估(一次),并导致错误,因为'&'此时不是一个数字。
要真正做到这一点,要么:
使用以'1,$!'开头的 sed 命令 在每一行调用 shell,并在那里使用 expr、awk、perl 或其他方式执行增量。
脚注:我从来不知道php-coder 显示的/e 修饰符。
好问题。smci 首先回答并发现了关于贝壳的信息。
如果你想解决这个问题,这里是(为了好玩)嵌入在示例中的 Ruby 解决方案:
echo "hdf 4 fs 88\n5 22 sdf lsd 6" | ruby -e 'ARGF.each {|line| puts line.gsub(/(\d+)/) {|n| n.to_i+1}}'
输出应该是
hdf 5 fs 89\n6 23 sdf lsd 7