Bash一行代码将所有[:punct:]字符替换为已转义的相同字符



我目前使用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逐行处理输入

最新更新