使用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
答案 0 :(得分:1)
如果Bash中的正则表达式支持允许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 :(得分:1)
您可以使用IF检查美元符号后面是否有任何字母,以防更换:
if [[ "$str" =~ \$[[:alpha:]] ]]; then
echo ${str/$/\$a};
else
echo $str;
fi
答案 2 :(得分:1)
演示:
for str in 'a $1' 'a $s'
do
[[ $str =~ \$([[:alpha:]]) ]]
echo ${str/\$/\$${BASH_REMATCH[1]:+a}}
done
结果:
a $1
a $as