使用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
使用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
這本來是平凡的,如果在猛砸正則表達式的支持允許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
表示它將匹配字符串中的所有匹配項。刪除,如果你只想只替換第一次出現。
您可以使用IF來檢查是否有任何字母后面的美元符號和情況做替換:
if [[ "$str" =~ \$[[:alpha:]] ]]; then
echo ${str/$/\$a};
else
echo $str;
fi
示範:
for str in 'a $1' 'a $s'
do
[[ $str =~ \$([[:alpha:]]) ]]
echo ${str/\$/\$${BASH_REMATCH[1]:+a}}
done
結果:
a $1
a $as