使用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