2010-12-15 78 views
0

使用bash,我有一个字符串:字符串模式替换在bash

str='a $s' 
echo ${str/\$/\$a} 
# a $as 
str='a $1' 
echo ${str/\$/\$a} 
# a $a1 

如何修改模式,如果单词以字母开头那只有更换执行?

我想

str='a $s' 
echo ${str/??/??} 
# a $as 
str='a $1' 
echo ${str/??/??} 
# a $1 

回答

1

这本来是平凡的,如果在猛砸正则表达式的支持允许lookahead。该解决方案将仅仅是${str/\$(?=[a-zA-Z])/\$a}。不幸的是,事实并非如此。

如果您不使用sed,您仍然可以这样做。

str='a $s' 
echo $str | sed 's/\$\([a-zA-Z]\)/\$a\1/g' # gives you a $as 

str='a $1' 
echo $str | sed 's/\$\([a-zA-Z]\)/\$a\1/g' # gives you a $1 

\$\([a-zA-Z]\)匹配$后跟一个字母并存储字母。如果找到匹配项,则替换为$a,后面跟着存储的字母表(\1)。欲了解更多详情,请致电see this tutorial

尾随g表示它将匹配字符串中的所有匹配项。删除,如果你只想只替换第一次出现。

1

您可以使用IF来检查是否有任何字母后面的美元符号和情况做替换:

if [[ "$str" =~ \$[[:alpha:]] ]]; then 
    echo ${str/$/\$a}; 
else 
    echo $str; 
fi 
1

示范:

for str in 'a $1' 'a $s' 
do 
    [[ $str =~ \$([[:alpha:]]) ]] 
    echo ${str/\$/\$${BASH_REMATCH[1]:+a}} 
done 

结果:

a $1 
a $as