【问题标题】:sed replace with variable with multiple lines [duplicate]sed用多行变量替换[重复]
【发布时间】:2011-10-04 19:08:12
【问题描述】:

我正在尝试用跨越多行的文本替换一个单词。我知道我可以简单地使用换行符 \n 来解决这个问题,但我想保持字符串“干净”任何不需要的格式。

下面的例子显然行不通:

read -r -d '' TEST <<EOI
a
b
c
EOI

sed -e "s/TOREPLACE/${TEST}/" file.txt

关于如何在不修改以 read 开头并以 EOI 结尾的部分的情况下实现这一点的任何想法?

【问题讨论】:

    标签: bash variables sed


    【解决方案1】:

    鉴于您使用的是 Bash,您可以使用它来替换 \n 换行符:

    sed -e "s/TOREPLACE/${TEST//$'\n'/\\n}/" file.txt
    

    为了获得适当的健壮性,您还需要转义 /&amp;\

    TEST="${TEST//\\/\\\\}"
    TEST="${TEST//\//\\/}"
    TEST="${TEST//&/\\&}"
    TEST="${TEST//$'\n'/\\n}"
    sed -e "s/TOREPLACE/$TEST/" file.txt
    

    如果你的匹配是整行并且你使用的是 GNU sed,那么使用它的r 命令可能会更容易:

    sed -e $'/TOREPLACE/{;z;r/dev/stdin\n}' file.txt <<<"$TEST"
    

    【讨论】:

      【解决方案2】:

      您可以编写如下脚本:

      sed -e 's/TOREPLACE/a\
      b\
      c\
      /g' file.txt
      

      有点神秘,但它有效。另请注意,除非您使用 -i 选项,否则不会就地修改文件。

      【讨论】:

      • 谢谢。我知道 -i 选项。实际上,我想使用变量以获得更好的可读性,并且我不想触及变量的内容。实际上......我倒是想知道如何做到这一点以供将来参考。你知道不涉及修改前5行的这个问题的解决方案吗?
      • 问题是read 将回车转换为空格,所以无论如何你都应该再次插入回车。
      【解决方案3】:

      棘手...但我的解决方案是:-

      read -r -d '' TEST <<EOI
      a
      b
      c
      EOI
      
      sed -e "s/TOREPLACE/`echo "$TEST"|awk '{printf("%s\\\\n", $0);}'|sed -e 's/\\\n$//'`/g" file.txt
      

      重要: 确保使用正确的反引号、单引号、双引号和空格 否则将无法正常工作。

      【讨论】:

        【解决方案4】:

        一个有趣的问题..

        这可能会让您更接近针对您的用例的解决方案。

        read -r -d '' TEST <<EOI
        a\\
        b\\
        c
        EOI
        
        echo TOREPLACE | sed -e "s/TOREPLACE/${TEST}/"
        a
        b
        c
        

        我希望这会有所帮助。

        【讨论】:

        • 目前我将继续使用这个......有趣的是,这似乎并不像我想象的那么简单......谢谢
        猜你喜欢
        • 1970-01-01
        • 2014-11-20
        • 2014-01-09
        • 2018-07-28
        • 2019-03-24
        • 1970-01-01
        • 2010-11-29
        • 2011-07-06
        • 2011-12-02
        相关资源
        最近更新 更多