【问题标题】:Mac OS X sed regexpMac OS X sed 正则表达式
【发布时间】:2015-01-26 23:38:02
【问题描述】:

我正在尝试在添加值时进行简单的查找替换数字,但在 Mac OS X 下未能这样做,例如

echo "abc top: 234px" |sed -E 's/top:[[:space:]]*([0-9]+)/echo $(echo "\1+16"|bc)/g' 

应该输出:"abc top: 250px"

而是输出:abc echo $(echo "234+16"|bc)px

【问题讨论】:

  • 使用硬引号 (') 会阻止 $(echo "\1+16"|bc) 被扩展。
  • @PaulR 有什么办法解决
  • 你只需要修正你的引用,即不要在你想要扩展的东西周围使用硬引号。
  • 您会添加一个固定版本作为答案吗?当我删除引号时,它给了我-bash: syntax error near unexpected token ('` error
  • 看起来即使您修复了引用也无法正常工作,因为您无法在 sed 中进行算术运算 - 请参阅 stackoverflow.com/questions/2687009/… + 考虑改用 awk。

标签: macos sed


【解决方案1】:

这是awk

echo "abc top: 234px" | awk '$NF=$NF+16"px"'
abc top: 250px

搜索 top 时更强大:

echo "abc top: 234px" | awk '/top:/ {$NF=$NF+16"px";print}'
abc top: 250px

这里不需要格式前缀px:

echo "abc top: 234px" | awk 'sub(/[0-9]+/,$NF+16)'
abc top: 250px

echo "abc top: 234px" | awk '/top:/ {sub(/[0-9]+/,$NF+16);print}'
abc top: 250px

【讨论】:

    【解决方案2】:

    您不能使用外部命令引用反向引用——当 echo | bc 被评估时(一旦你修复了引用以便他们首先被评估),sed 脚本没有尚未解析。

    您可以做的是切换到允许对捕获的值进行算术运算的工具。

    echo "abc top: 234px" |
    perl -pe 's/(top:\s*)(\d+)/ sprintf("%s%i", $1, 16+$2)/ge'
    

    【讨论】:

      【解决方案3】:

      sed 比较困难,但是这里有一个 perl 解决方案:

      $ echo "abc top: 234px" | perl -pe 's/(\d+)/16 + $1/ge'
      abc top: 250px
      

      【讨论】:

        猜你喜欢
        • 2017-03-02
        • 2012-08-24
        • 2014-09-01
        • 2010-11-16
        • 2018-11-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多