使用Bash单行替换所有[:punct:]字符并使用相同的字符进行转义

时间:2015-09-18 12:12:49

标签: regex bash string-substitution

我目前尚未解决的bash问题是如何替换[:punct:]类中的所有字符,即

[!"#$%&'()*+,\-./:;<=>?@[\\\]^_`{|}~]

,每个具有相同字符的反斜杠转义。例如,我希望^h?e.l*l+o:成为\^h\?e\.l\*l\+o\:

我可以用循环的多线程方式做到这一点。是否有可能以更加娴熟和优雅的方式做到这一点?

谢谢, 卢卡

1 个答案:

答案 0 :(得分:4)

您可以使用sed吗?

echo '^h?e.l*l+o:' | sed 's/\([[:punct:]]\)/\\\1/g'

没有sed,除了循环字符之外我什么也想不到:

s='^h?e.l*l+o:'
o=''
for ((i=0; i<${#s}; i++)) ; do
    c=${s:i:1}
    [[ $c =~ [[:punct:]] ]] && o+=\\
    o+=$c
done
echo "$o"

另一种可能性是使用Perl的quotemeta

echo '^h?e.l*l+o:' | perl -lne 'print quotemeta'

-l处理换行符。 -n逐行处理输入。