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