我有一个像AxxBCyyyDEFzzLMN这样的字符串,我想用_替换所有出现的x, y和z。
AxxBCyyyDEFzzLMN
_
x
y
z
我怎样才能做到这一点呢?
我知道echo "$string" | tr 'x' '_' | tr 'y' '_'可以工作,但我想一次性完成,而不使用管道。
echo "$string" | tr 'x' '_' | tr 'y' '_'
使用Bash参数扩展:
orig="AxxBCyyyDEFzzLMN" mod=${orig//[xyz]/_}
echo "$string" | tr xyz _
将用_替换x、y或z,在你的例子中给出A__BC___DEF__LMN。
A__BC___DEF__LMN
echo "$string" | sed -r 's/[xyz]+/_/g'
将用一个_替换重复出现的x、y或z,在你的例子中给出A_BC_DEF_LMN。
A_BC_DEF_LMN
read filename ; sed -i 's/letter/newletter/g' "$filename" #letter
^只要你需要,你可以使用很多这些,你可以自己做BASIC加密
通常,用$replacement替换$substring的第一个匹配:
$replacement
$substring
${string/substring/replacement}
用$replacement替换$substring的所有匹配项:
${string//substring/replacement}
$string
下面是一个shell参数扩展的解决方案,它用一个_替换多次连续出现:
$ var=AxxBCyyyDEFzzLMN $ echo "${var//+([xyz])/_}" A_BC_DEF_LMN
注意,+(pattern)模式需要扩展模式匹配,打开
+(pattern)
shopt -s extglob
或者,使用tr的-s ("squeeze")选项:
tr
-s
$ 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