2010-12-15 76 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