【发布时间】:2011-10-10 19:35:39
【问题描述】:
是否可以在 sed 中操作 & 符号?我想为文件中的所有数字添加 +1。像这样的:
sed -i "s/[0-9]\{1,2\}/$(expr & + 1)/g" filename
编辑:今天我使用 grep 和 sed 创建了一个循环来完成所需的工作。但是,如果有人知道操纵 & 符号的方法,这个问题仍然悬而未决,因为 这不是我第一次想在替换字符串上运行命令,并且不能。
【问题讨论】:
是否可以在 sed 中操作 & 符号?我想为文件中的所有数字添加 +1。像这样的:
sed -i "s/[0-9]\{1,2\}/$(expr & + 1)/g" filename
编辑:今天我使用 grep 和 sed 创建了一个循环来完成所需的工作。但是,如果有人知道操纵 & 符号的方法,这个问题仍然悬而未决,因为 这不是我第一次想在替换字符串上运行命令,并且不能。
【问题讨论】:
sed 需要在 each 行上输入一些 shell 命令(带有 '!')才能做到这一点。
在这里,您认为您正在调用 sed,然后它会回调到 shell 以评估每一行的 $(expr & + 1),但实际上并非如此。 $(expr & + 1) 只会被外壳静态评估(一次),并导致错误,因为此时 '&' 不是数字。
要真正做到这一点,要么:
hardcode all ten cases of last digit 0..9, as per this example in sed documentation
使用以 '1,$!' 开头的 sed 命令在每一行调用 shell,并在那里使用 expr、awk、perl 或其他方式执行增量。
脚注:我从来不知道 php-coder 显示的 /e modifier。
【讨论】:
很好的问题。 smci 最先回答并发现了关于 shell 的问题。
如果你想解决这个问题,这里是(为了好玩)嵌入在示例中的 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
【讨论】:
您可以使用e 修饰符来实现:
$ cat test.txt
1
2
$ sed 's/^[0-9]\{1,2\}$/expr & + 1/e' test.txt
2
3
在这种情况下,您应该在替换部分构造命令,该命令将被执行,结果将用于替换。
【讨论】:
e 在这种情况下不应该工作。 (恕我直言,一个好主意是显示输入数据和理想的输出来说明问题。)
$vbx02->pack_start($hbx01); 和 $btn03 = GtkButton::new_from_stock(Gtk::STOCK_CANCEL);