【问题标题】:sed substitute replaces curly braces ${i} - How to stop that?sed 替换替换花括号 ${i} - 如何阻止它?
【发布时间】:2013-01-26 17:40:04
【问题描述】:

我正在尝试使用 sed 将 13 替换为 21

echo "for i in {1..5}; do commands for FILE13 > output_${i}; done" | sed 's/13/21/g'

我的输出如下所示:

for i in {1..5}; do commands for FILE21 > output_2; done

13 被替换为 21,但另外${i} 被替换为 2

为什么会这样?以及如何停止 sed 替换 mu 花括号内容?

编辑

如果我的命令如下所示:

echo 'for i in {1..5}; awk'{( do commands)}' FILE13  > output_${i}; done' | sed 's/13/21/g'

当我收到 bash: syntax error near unexpected token('`

时,我无法将双引号替换为单引号

是使用\ 转义大括号的唯一解决方案吗?

【问题讨论】:

  • 这听起来像是一个 XY 问题。为什么要编辑 shell 命令?您是否只需要一个遍历 FILE13 和 FILE21 的外部 for 循环?如果这是用于交互式 shell,请阅读 shell 的历史机制。

标签: sed


【解决方案1】:

您不能在单引号字符串中嵌入单引号。试试:

echo 'for i in {1..5}; awk'"'"'{( do commands)}'"'"' FILE13  > output_${i}; done'

【讨论】:

    【解决方案2】:

    不是 sed 替换了花括号,而是 shell。将回显字符串的双引号更改为单引号。

    比较:

    $ echo "for i in {1..5}; do commands for FILE13 > output_${i}; done"
    for i in {1..5}; do commands for FILE13 > output_; done
    
    $ echo 'for i in {1..5}; do commands for FILE13 > output_${i}; done'
    for i in {1..5}; do commands for FILE13 > output_${i}; done
    

    如果您要回显的字符串本身包含单引号,则使用双引号并转义 $ 或直接处理引号:

    $ echo "for i in {1..5}; awk'{( do commands)}' FILE13  > output_\${i}; done"
    for i in {1..5}; awk'{( do commands)}' FILE13  > output_${i}; done
    
    $ echo 'for i in {1..5}; awk'"'"'{( do commands)}'"'"' FILE13  > output_${i}; done'
    for i in {1..5}; awk'{( do commands)}' FILE13  > output_${i}; done
    

    【讨论】:

      【解决方案3】:

      echo 的参数是文字字符串吗?那么:

      echo "for i in {1..5}; do commands for FILE13 > output_\${i}; done" | sed 's/13/21/g'
      

      【讨论】:

        猜你喜欢
        • 2016-11-25
        • 2014-03-09
        • 2018-03-21
        • 2012-08-25
        • 1970-01-01
        • 1970-01-01
        • 2016-04-19
        • 1970-01-01
        • 2022-01-22
        相关资源
        最近更新 更多