在shell脚本中replace另一个string的一个子string

我有“我爱苏子嫁”,我想把“苏子”换成“萨拉”。

#!/bin/bash firstString="I love Suzi and Marry" secondString="Sara" # do something... 

结果必须是这样的:

 firstString="I love Sara and Marry" 

要replace第一次出现的string(实际上是正则expression式),请使用${string/regexp/replacement}

 #!/bin/bash original_string='I love Suzy and Mary' string_to_replace_Suzy_with='Sara' result_string="${original_string/Suzy/$string_to_replace_Suzy_with}" 

要用$ replacementreplace$ pattern的所有匹配项,请将第一个斜杠加倍:

 string="The secret code is 12345" pattern="[0-9]" echo ${string//$pattern/X} # The secret code is XXXXX 

确保脚本是用bash执行的。 其他shell(例如sh )可能会返回“错误replace”。

这可以完全用bashstring处理完成:

 first="I love Suzy and Mary" second="Sara" first=${first/Suzy/$second} 

这将只取代第一次出现; 把他们全部取代,加倍第一个斜线:

 first="Suzy, Suzy, Suzy" second="Sara" first=${first//Suzy/$second} # first is now "Sara, Sara, Sara" 

如果string包含RegExp字符,最好使用bash而不是sed

 echo ${first_string/Suzi/$second_string} 

它可移植到Windows,并且至less与Bash 3.1一样久。

为了显示你不需要担心太多的转义,让我们来看看这个:

 /home/name/foo/bar 

进入这个:

 ~/foo/bar 

但只有/home/name在开头。 我们不需要sed

鉴于bash给我们的variables$PWD$HOME ,我们可以:

 echo "${PWD/#$HOME/\~}" 

编辑:感谢马克Haferkamp在注释引用/转义的注释~ *。

注意variables$HOME如何包含斜杠的,但是这并没有破坏任何东西。

进一步阅读: 高级Bash脚本指南 。
如果使用sed是必须的,一定要逃避每个angular色 。

尝试这个:

  sed "s/Suzi/$secondString/g" <<<"$firstString" 

对于破折号的所有以前的职位是行不通的

破折号:

 result=$(echo $firstString | sed 's/Suzi/$secondString/g') 

如果明天你决定你不爱结婚也可以replace:

 today=$(</tmp/lovers.txt) tomorrow="${today//Suzi/Sara}" echo "${tomorrow//Marry/Jesica}" > /tmp/lovers.txt 

必须有50种方式离开你的爱人。