我可以使用 sed 来操作 bash 中的变量吗?

Posted

技术标签:

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

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

echo "input a website"
read website

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

【问题讨论】:

【参考方案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://***.com/a/58899829/658497"
echo "$website//\//\\/"

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

【讨论】:

以上是关于我可以使用 sed 来操作 bash 中的变量吗?的主要内容,如果未能解决你的问题,请参考以下文章

sed 用 Bash 变量替换

无法在Bash中使用变量分配另一个变量

Linux Shell编程中的特殊符号

需要将存储在 bash 变量中的 IP 地址分解为八位字节

bash shell参数展开(Shell Parameter Expansion):替换变量(variable)中的字符串

使用 bash 变量时 sed 结果不同