bash中的字符串模式替换

时间:2010-12-15 17:14:41

标签: 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

3 个答案:

答案 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
相关问题