3

是否可以在 sed 中操作 & 符号?我想为文件中的所有数字添加 +1。像这样的东西:

sed -i "s/[0-9]\{1,2\}/$(expr & + 1)/g" filename

编辑:今天我使用 grep 和 sed 创建了一个循环来完成所需的工作。但是,如果有人知道操纵 & 符号的方法,这个问题仍然悬而未决,因为这不是我第一次想在替换字符串上运行命令,并且 can't

4

3 回答 3

2

您可以使用e修饰符来实现这一点:

$ cat test.txt
1
2
$ sed 's/^[0-9]\{1,2\}$/expr & + 1/e' test.txt
2
3

在这种情况下,您应该在替换部分构造命令,该命令将被执行,结果将用于替换。

于 2011-07-22T07:05:57.183 回答
1

sed 需要在每一行上输入一些 shell 命令(带有'!')才能做到这一点。

在这里,您认为您正在调用 sed,然后它会回调到 shell 以评估$(expr & + 1)每一行,但实际上并非如此。$(expr & + 1)只会被外壳静态评估(一次),并导致错误,因为'&'此时不是一个数字。

要真正做到这一点,要么:

  1. 根据 sed 文档中的示例,硬编码最后一位 0..9 的所有十个案例

  2. 使用以'1,$!'开头的 sed 命令 在每一行调用 shell,并在那里使用 expr、awk、perl 或其他方式执行增量。

  3. 脚注:我从来不知道php-coder 显示的/e 修饰符。

于 2011-07-22T06:49:57.530 回答
1

好问题。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
于 2011-07-22T07:01:58.900 回答