在sed中操纵&符号

时间:2011-07-22 06:33:33

标签: sed ampersand

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

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

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

3 个答案:

答案 0 :(得分:2)

您可以使用e修饰符来实现此目的:

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

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

答案 1 :(得分:1)

sed将需要在每个行上使用一些shell命令(带'!')来执行此操作。

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

要实际执行此操作,请执行以下操作:

  1. <强> hardcode all ten cases of last digit 0..9, as per this example in sed documentation

  2. 使用以'1,$!'开头的sed命令来调用每一行的shell,并使用expr,awk,perl等执行增量。

  3. 脚注:我从来不知道php编码器显示的/e modifier

答案 2 :(得分: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