协慌网

登录 贡献 社区

将一个子字符串替换为 Shell 脚本中的另一个字符串

我有 “我爱 Suzi 和结婚”,我想将 “Suzi” 更改为 “Sara”。

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

结果必须是这样的:

firstString="I love Sara and Marry"

答案

要用给定的字符串替换第一次出现的模式,请使用${ <em>parameter</em> / <em>pattern</em> / <em>string</em> }

#!/bin/bash
firstString="I love Suzi and Marry"
secondString="Sara"
echo "${firstString/Suzi/$secondString}"    
# prints 'I love Sara and Marry'

要替换所有出现的内容,请使用${ <em>parameter</em> // <em>pattern</em> / <em>string</em> }

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

(这在Bash 参考手册的第 3.5.3 节 “Shell 参数扩展” 中进行了介绍 。)

请注意,POSIX 未指定此功能 - 它是 Bash 扩展 - 因此并非所有 Unix Shell 都实现此功能。有关相关的 POSIX 文档,请参见《 Open Group 技术标准基础规范》第 7 期Shell&Utilities卷,第 2.6.2 节 “参数扩展”

这可以完全通过 bash 字符串操作来完成:

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"

尝试这个:

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