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"

もう 1 つの可能性は、Perl のquotemetaを使用することです。

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

-l改行を処理します。-n入力を 1 行ずつ処理します。

于 2015-09-18T12:17:18.457 に答える