用“$ {parameter / pattern / string}”替换字符串中的“/”?

时间:2017-02-03 20:53:55

标签: bash

我有一个参数$1,例如设置为字符串operations/software/tools-manifest,我想将其转换为字符串operations-software-tools-manifest,i。即用破折号(/)替换所有斜杠(-)。单独bash是否可以实现这一点,而不是仅举例sed(1)

我尝试过(不成功):

[tim@passepartout ~]$ testparam=operations/software/tools-manifest
[tim@passepartout ~]$ echo "${testparam////-/}"
operations-/software-/tools-manifest
[tim@passepartout ~]$ echo "${testparam///-/}"
operations/software/tools-manifest
[tim@passepartout ~]$ echo "${testparam//\//-/}"
operations-/software-/tools-manifest
[tim@passepartout ~]$ echo "${testparam//\\//-/}"
operations/software/tools-manifest
[tim@passepartout ~]$ echo "${testparam//[/]/-/}"
operations/software/tools-manifest
[tim@passepartout ~]$ echo "${testparam//\x2f/-/}"
operations/software/tools-manifest
[tim@passepartout ~]$ echo "${testparam//\57/-/}"
operations/software/tools-manifest
[tim@passepartout ~]$

2 个答案:

答案 0 :(得分:4)

您可以使用"${testparam//\//-}"替换所有正斜杠-

echo "${testparam//\//-}"
operations-software-tools-manifest

答案 1 :(得分:4)

最简单,最通用的方法之一是将源和目标放在变量中。

in="/"
out="-"
testparam=operations/software/tools-manifest
echo "${testparam//$in/$out}"

如果你想抑制通配(为了在in='*'testparam='hello*cruel*world'时使用),那么你需要引用"$in"

in="*"
out="-"
testparam='operations*software*tools'
echo "${testparam//"$in"/$out}"

如果没有多余的引号,单个*将展开以匹配整个输入字符串,因此输出将仅包含-