【问题标题】:sed: replace first instance only with string containing bash variablesed:仅用包含 bash 变量的字符串替换第一个实例
【发布时间】:2018-05-31 00:13:16
【问题描述】:

这是How to use sed to replace only the first occurrence in a file? 的后续版本,但提出了更有针对性的提问。给定一个文件

Peach: data/file1.txt
Apple: data/file2.txt
Pear: data/file3.txt
Apple: data/file4.txt

目标是仅将包含 Apple 的第一行替换为包含固定字符串 (Banana) 后跟 bash 变量的新行。在新输出中,第 2 行现在是:

Banana: newdata/data.txt

这是最近的尝试...

BananaVariable=newdata
sed -i -E "0,|(Apple).*|{s|(Apple:).*|Banana: "$BananaVariable"/data.txt|}" filename

但是,这会产生错误:

sed: -e expression #1, char 3: unexpected  `,'

我认为我需要 $BananaVariable 周围的双引号来转义,以便它可以插入实际字符串而不是“BananaVariable”,但我认为这些双引号导致了问题。 (操作系统为 CentOS 7,sed 为 GNU 版本)

【问题讨论】:

    标签: regex bash unix sed centos7


    【解决方案1】:

    来自man sed

    /regexp/
           Match lines matching the regular expression regexp.
    
    \cregexpc
           Match  lines  matching the regular expression regexp.  The c may
           be any character.
    

    因此,在您的原始命令中,将前两个小节 | 替换为斜杠 /(等效地,将第一个 | 替换为 \|):

    sed -i -E "0,/(Apple).*/{s|(Apple:).*|Banana: $BananaVariable/data.txt|}" filename
    

    您还可以缩短命令:

    sed -i -E "0,/^Apple/s|.*|Banana: $BananaVariable/data.txt|" filename
    

    输出:

    Peach: data/file1.txt
    Banana: newdata/data.txt
    Pear: data/file3.txt
    Apple: data/file4.txt
    

    【讨论】:

    • 您应该在$BananaVariable 周围去掉双引号,因为它会使变量有效地不被引用。
    • @Sergio 您的第一个建议可以正常工作,并且对当前代码的更改最少——谢谢!您的第二个建议是(迄今为止)提出的最经济的解决方案。
    【解决方案2】:

    awk 更容易:

    var='newdata/data.txt'
    awk -v v="$var" 'BEGIN{FS=OFS=": "}
    !p && $1 == "Apple"{$1="Banana"; $2=v; p=1} 1' file
    

    Peach: data/file1.txt
    Banana: newdata/data.txt
    Pear: data/file3.txt
    Apple: data/file4.txt
    

    【讨论】:

      【解决方案3】:

      这可能对你有用(GNU sed):

      sed -i -e '0,/Apple/!b;//cBanana: '"$BananaVariable"'/data.txt' file
      

      如果文件前面没有一行,直到包含Apple的行正常打印。否则,使用变量将包含Apple 的行更改为所需的字符串。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-30
        • 2012-01-26
        • 2021-10-13
        • 1970-01-01
        • 2014-02-16
        • 2019-10-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多