遊んtr
で予想外の結果を得ました。このような状況ではどうなりますか?後で何が起こっているのかわからない場合や、このコマンドを正しく使用しない可能性があります。
例A
echo '0123456789' | tr [:digit:] '12'
1222222222
実施例B1
echo '1111111111' | tr [:digit:] '12'
2222222222
例B2
echo '1111111111' | tr '1' '12'
1111111111
実施例C1
期待どおりに動作します。
echo '0123456789' | tr '5' 'x'
01234x6789
実施例C2
私はこれが01234xx6789
生成されるかもしれないかどうかにかかわらず、これらすべての例を説明すると期待しました。なぜなら、元の文字だけを置き換えることができるからです(他の文字は追加できません)。
echo '0123456789' | tr '5' 'xx'
01234x6789
答え1
tr
パラメータは次のとおりです。地図文字数:文字は1:1の順序でマッピングされます。代替セットでは、必要に応じて最後の文字が繰り返されます。追加文字は無視されます。
だから
tr 5 x
予想通り、「5」を「x」に置き換えます。
tr 5 xx
また、「5」を「x」に置き換えます。追加の「x」は無視されます。
tr 1 12
「1」を「1」に「置き換えます」。追加の「2」は無視されます。
tr '[:digit:]' '12'
シェル拡張を避けるために引用される(ロケールによって異なる)
tr 0123456789 122222222
そして、「0」を「1」に、「1」を「9」を「2」に変更します。
答え2
IMO この動作はmacos tr マニュアルページ:
最初の要約フォームでは、string1の文字がstring2の文字に変換されます。ここで、string1の最初の文字はstring2の最初の文字に変換されます。 string1がstring2より長い場合、string2で見つかった最後の文字は、string1が使い果たされるまで繰り返されます。