我有"我爱Suzi和Marry",我想把"Suzi"改为"Sara".
#!/bin/bash
firstString="I love Suzi and Marry"
secondString="Sara"
# do something...
Run Code Online (Sandbox Code Playgroud)
结果必须是这样的:
firstString="I love Sara and Marry"
Run Code Online (Sandbox Code Playgroud)
    rua*_*akh 1155
要使用给定字符串替换第一次出现的模式,请使用:${parameter/pattern/string}
#!/bin/bash
firstString="I love Suzi and Marry"
secondString="Sara"
echo "${firstString/Suzi/$secondString}"    
# prints 'I love Sara and Marry'
Run Code Online (Sandbox Code Playgroud)
要替换所有实例,请使用:${parameter//pattern/string}
message='The secret code is 12345'
echo "${message//[0-9]/X}"           
# prints 'The secret code is XXXXX'
Run Code Online (Sandbox Code Playgroud)
(这是在记录所述击参考手册,§3.5.3"壳牌参数扩展".)
请注意,POSIX没有指定此功能 - 它是Bash扩展 - 因此并非所有Unix shell都实现它.有关POSIX文档,请参阅Open Group技术标准基本规范,第7期,Shell&Utilities卷,第2.6.2节"参数扩展".
Kev*_*vin 178
这可以通过bash字符串操作完全完成:
first="I love Suzy and Mary"
second="Sara"
first=${first/Suzy/$second}
Run Code Online (Sandbox Code Playgroud)
这将只取代第一次出现; 要替换它们,将第一个斜线加倍:
first="Suzy, Suzy, Suzy"
second="Sara"
first=${first//Suzy/$second}
# first is now "Sara, Sara, Sara"
Run Code Online (Sandbox Code Playgroud)
        Ken*_*ent 61
试试这个:
 sed "s/Suzi/$secondString/g" <<<"$firstString"
Run Code Online (Sandbox Code Playgroud)
        Rom*_*kyi 59
对于Dash,所有以前的帖子都不起作用
POSIX sh兼容解决方案是:
result=$(echo "$firstString" | sed "s/Suzi/$secondString/")
Run Code Online (Sandbox Code Playgroud)
        Cam*_*tin 45
使用bash比使用sedRegExp字符更好.
echo ${first_string/Suzi/$second_string}
Run Code Online (Sandbox Code Playgroud)
它可以移植到Windows,并且至少与Bash 3.1一样老.
为了表明你不需要担心逃避让我们转过来:
/home/name/foo/bar
Run Code Online (Sandbox Code Playgroud)
进入:
~/foo/bar
Run Code Online (Sandbox Code Playgroud)
但只有/home/name在开始的时候.我们不需要sed!
鉴于庆典带给我们神奇的变量$PWD和$HOME,我们可以:
echo "${PWD/#$HOME/\~}"
Run Code Online (Sandbox Code Playgroud)
编辑:感谢Mark Haferkamp在关于引用/转义的说明的评论中~.*
注意变量如何$HOME包含斜杠,但这并没有破坏任何东西.
进一步阅读:高级Bash-Scripting Guide.
如果sed必须使用,请务必逃避每个角色.
Jos*_*das 19
如果明天你决定不爱结婚,她也可以被替换:
today=$(</tmp/lovers.txt)
tomorrow="${today//Suzi/Sara}"
echo "${tomorrow//Marry/Jesica}" > /tmp/lovers.txt
Run Code Online (Sandbox Code Playgroud)
离开你的爱人必须有50种方法.
Alb*_*lla 16
echo [string] | sed "s/[original]/[target]/g"
Run Code Online (Sandbox Code Playgroud)
我知道这是旧的,但因为没有人提到使用 awk:
    firstString="I love Suzi and Marry"
    echo $firstString | awk '{gsub("Suzi","Sara"); print}'Run Code Online (Sandbox Code Playgroud)
        纯POSIX shell 方法,与Roman Kazanovskyi的sed基于答案不同,不需要外部工具,只需要 shell 自己的本机参数扩展。请注意,长文件名被最小化,因此代码更适合一行:
f="I love Suzi and Marry"
s=Sara
t=Suzi
[ "${f%$t*}" != "$f" ] && f="${f%$t*}$s${f#*$t}"
echo "$f"
Run Code Online (Sandbox Code Playgroud)
输出:
I love Sara and Marry
Run Code Online (Sandbox Code Playgroud)
这个怎么运作:
删除最小后缀模式。  如果后缀“ ”在“ ”中,则"${f%$t*}"返回“ ”。  I love$tSuzi*$fI love Suzi and Marry
但是如果t=Zelda,则不"${f%$t*}"删除任何内容,并返回整个字符串“ I love Suzi and Marry”。
如果这是用来测试$t是在$f与[ "${f%$t*}" != "$f" ]其中将评估为真如果$f字符串包含“ Suzi*”的虚假如果不是。
如果测试返回true,则使用移除最小后缀模式 ${f%$t*}“ I love”和移除最小前缀模式 ${f#*$t}“ and Marry”构建所需的字符串,中间有第二个字符串$s“ Sara”。
用特殊章程替换第一次出现的模式:
${参数/模式/字符串}
用特殊章程替换所有出现的模式:
${参数//模式/字符串}
firstString="I love //Suzi// and Marry"
secondString="Sara"
firstString="${firstString/\/\/Suzi\/\//"$secondString"}"
echo $firstString
Run Code Online (Sandbox Code Playgroud)
它将打印:I love Sara and Marry
我认为这是适合您的用例的最干净的形式:
firstString="${firstString//Suzi/$secondString}"
Run Code Online (Sandbox Code Playgroud)
        小智 7
由于我无法添加评论。@ruaka为了使示例更易读,请像这样编写
full_string="I love Suzy and Mary"
search_string="Suzy"
replace_string="Sara"
my_string=${full_string/$search_string/$replace_string}
or
my_string=${full_string/Suzy/Sarah}
Run Code Online (Sandbox Code Playgroud)