用另一个字符替换字符串中的某些字符

我有一个像AxxBCyyyDEFzzLMN这样的字符串,我想用_替换所有出现的xyz

我怎样才能做到这一点呢?

我知道echo "$string" | tr 'x' '_' | tr 'y' '_'可以工作,但我想一次性完成,而不使用管道。

732656 次浏览

使用Bash参数扩展:

orig="AxxBCyyyDEFzzLMN"
mod=${orig//[xyz]/_}
echo "$string" | tr xyz _

将用_替换xyz,在你的例子中给出A__BC___DEF__LMN

echo "$string" | sed -r 's/[xyz]+/_/g'

将用一个_替换重复出现的xyz,在你的例子中给出A_BC_DEF_LMN

read filename ;
sed -i 's/letter/newletter/g' "$filename" #letter

^只要你需要,你可以使用很多这些,你可以自己做BASIC加密

你可能会发现这个链接很有用: http://tldp.org/LDP/abs/html/string-manipulation.html . < / p >

通常,用$replacement替换$substring的第一个匹配:

${string/substring/replacement}

$replacement替换$substring的所有匹配项:

${string//substring/replacement}
< p >编辑: 注意,这适用于名为$string的变量

下面是一个shell参数扩展的解决方案,它用一个_替换多次连续出现:

$ var=AxxBCyyyDEFzzLMN
$ echo "${var//+([xyz])/_}"
A_BC_DEF_LMN

注意,+(pattern)模式需要扩展模式匹配,打开

shopt -s extglob

或者,使用tr-s ("squeeze")选项:

$ tr -s xyz _ <<< "$var"
A_BC_DEF_LMN
echo 'I dont like PHP' |  sed -r 's/I dont like/I love/g'
## Output: I love PHP

echo 'I like PHP' |  sed -r 's/like/love/g'
## Output: I love PHP