【问题标题】:Can I use sed to manipulate a variable in bash?我可以使用 sed 来操作 bash 中的变量吗?
【发布时间】:2011-10-08 07:27:18
【问题描述】:

在我的程序中,我想先获取用户输入,然后在每个/ 之前插入一个\ 所以我写了这个,但它不起作用。

echo "input a website"
read website

sed '/\//i\/' $website

【问题讨论】:

    标签: bash replace sed


    【解决方案1】:

    试试这个:

    website=$(sed 's|/|\\/|g' <<< $website)
    

    Bash 实际上支持这种替换 natively:

    ${parameter/pattern/string} — 将pattern 的第一个匹配项替换为string
    ${parameter//pattern/string} — 将pattern 的所有匹配项替换为string

    因此你可以这样做:

    website=${website////\\/}
    

    解释:

    website=${website // / / \\/}
                      ^  ^ ^  ^
                      |  | |  |
                      |  | |  string, '\' needs to be backslashed
                      |  | delimiter
                      |  pattern
                      replace globally
    

    【讨论】:

    • 原生版本不适用于我的变量内容很大command to long:
    • Eugene,非常感谢您详细说明 sed 的哪个部分做了什么。这是我迄今为止看到的最清楚的解释。
    • 为难以置信的细节点赞,尤其是。 '\' needs to be backslashed
    【解决方案2】:
    echo $website | sed 's/\//\\\//g'
    

    或者,为了更好的可读性:

    echo $website | sed 's|/|\\/|g'
    

    【讨论】:

    • 它也很好用。你介意解释一下这个's/\//\\\//g'和这个's|/|\\/|g'吗??
    • searchreplacecommand|source|target|global(all matches) 可以使用任何字符作为分隔符 (|)。传统上/ 用于分隔符
    • 但是当我使用“”和变量时。它不插入任何东西。你能找出原因吗?谢谢
    • 这不会将修改后的内容保存回变量中
    【解决方案3】:

    您也可以使用Parameter-Expansion 替换变量中的子字符串。 例如:

    website="https://stackoverflow.com/a/58899829/658497"
    echo "${website//\//\\/}"
    

    https:\/\/st​​ackoverflow.com\/a\/58899829\/658497

    【讨论】:

      猜你喜欢
      • 2018-10-17
      • 2020-01-13
      • 2013-12-26
      • 1970-01-01
      • 1970-01-01
      • 2019-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多