在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种方式离开你的爱人。