1

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

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

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

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

谢谢,卢卡

4

1 回答 1

5

你能用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逐行处理输入。

于 2015-09-18T12:17:18.457 回答