我目前尚未解决的bash问题是如何替换[:punct:]
类中的所有字符,即
[!"#$%&'()*+,\-./:;<=>?@[\\\]^_`{|}~]
,每个具有相同字符的反斜杠转义。例如,我希望^h?e.l*l+o:
成为\^h\?e\.l\*l\+o\:
。
我可以用循环的多线程方式做到这一点。是否有可能以更加娴熟和优雅的方式做到这一点?
谢谢, 卢卡
答案 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
逐行处理输入。