【问题标题】:Manipulate ampersand in sed在 sed 中操作 & 符号
【发布时间】:2011-10-10 19:35:39
【问题描述】:

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

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

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

【问题讨论】:

    标签: sed ampersand


    【解决方案1】:

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

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

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

    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-coder 显示的 /e modifier

    【讨论】:

    • 我不明白!像这样的东西? sed ''1,$!' s/[0-9]\{1,2\}/'$(expr & + 1)'/g' 文件名
    • 我现在无法访问 UNIX shell,你得试一试。
    【解决方案2】:

    很好的问题。 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
    

    【讨论】:

    • 谢谢!我没有安装红宝石!不值得为此安装!
    【解决方案3】:

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

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

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

    【讨论】:

    • 快到了!该文件不仅有数字。它也有括号,所以我得到:sh:语法错误:“(”意外
    • 抱歉没有正确解释:内容混杂:$vbx02->pack_start($hbx01);
    • 从来不知道!它总是在 sed 中吗?
    • @teresa-e-junior e 在这种情况下不应该工作。 (恕我直言,一个好主意是显示输入数据和理想的输出来说明问题。)
    • @php-coder 大多数行看起来像:$vbx02->pack_start($hbx01);$btn03 = GtkButton::new_from_stock(Gtk::STOCK_CANCEL);
    猜你喜欢
    • 2019-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多