【问题标题】:Replace substring of a line with a given string用给定的字符串替换行的子字符串
【发布时间】:2019-02-01 15:56:21
【问题描述】:

我正在尝试用不同的名称替换名称,这可行,但是当我有“[]”时它不起作用。

#!/bin/bash
firstString="I love [Candy] Store"
firstChange="[Candy] Store"
secondString="Chocolate Store"
echo "${firstString//$firstChange/$secondString}"

我期待:

"I love Chocolate Store".

工作示例:

#!/bin/bash
firstString="I love Candy Store"
firstChange="Candy Store"
secondString="Chocolate Store"
echo "${firstString//$firstChange/$secondString}"

输出:

I love Chocolate Store.

我正在尝试使其适用于这两种情况。

有人可以帮我吗?

谢谢

【问题讨论】:

    标签: bash


    【解决方案1】:

    好吧,这行得通:

    #!/bin/bash
    firstString="I love [Candy] Store"
    firstChange="\[Candy\] Store"
    secondString="Chocolate Store"
    echo "${firstString//$firstChange/$secondString}"
    

    它可能对你没有多大帮助;如果您的“更改”字符串是从某个地方输入的,您不能指望它被正确转义。

    问题在于 bash 扩展将 firstChange 值视为模式而不是常规字符串。

    根据这个答案 https://stackoverflow.com/a/2856010/200136 , printf "%q" 是解决方案:

    #!/bin/bash
    firstString="I love [Candy] Store"
    firstChange="[Candy] Store"
    printf -v quoteChange "%q\n" $firstChange
    safeChange=$(echo $quoteChange)
    secondString="Chocolate Store"
    echo "${firstString//$safeChange/$secondString}"
    

    【讨论】:

    • umm.. [Candy] Store 是作为字符串传递的,所以我想我不能像你上面提到的那样修改它
    • 是的,这就是我所说的“可能对你没有多大帮助”的意思。编辑以包含一个可能更通用的解决方案
    • 我能够通过以下方式解决它: echo "${firstString//"$firstChange"/$secondString}"
    • 非常感谢您的帮助,我从您的解决方案中得到了这个想法:)
    猜你喜欢
    • 2020-02-25
    • 2017-03-23
    • 1970-01-01
    • 2012-04-03
    • 2013-07-23
    • 1970-01-01
    相关资源
    最近更新 更多