我能用sed在bash中操作变量吗?

81

我想在我的程序中先获取用户输入,然后在每个/前面插入一个\,所以我写了这段代码,但它无法工作。

echo "input a website"
read website

sed '/\//i\/' $website
3个回答

188

试试这个:

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

Bash实际上本地支持这种替换:

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

因此,您可以执行以下操作:

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

解释:

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

1
原生版本无法处理大变量内容,提示“命令过长”。 - Artistan
3
Eugene,非常感谢你对sed的各个部分进行了详细的解释。这是我迄今为止看到的最清晰的解释。 - Montag
因为详细程度惊人,特别是需要反斜杠的 '\',我点了赞。 - Jesse Nickles

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

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

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

它也很好用。您介意解释一下这个 's///\//g' 和 's|/|\/|g' 吗? - Leo Chan
1
searchreplacecommand|source|target|global(all matches) 其中您可以使用任何字符作为分隔符(|),传统上使用 / 作为分隔符。 - Karoly Horvath
然而,当我使用“”和变量时,它不会插入任何内容。你能找出原因吗?谢谢。 - Leo Chan
这不会将修改后的内容保存回变量中。 - Joel Ravazzolo

2
您还可以使用“参数扩展”来替换变量中的子字符串。例如:Parameter-Expansion
website="https://dev59.com/Hmw15IYBdhLWcg3wO5SX#58899829"
echo "${website//\//\\/}"

https:\/\/stackoverflow.com\/a\/58899829\/658497


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接