"tr"コマンドはどのように機能しますか?

"tr"コマンドはどのように機能しますか?

遊ん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が使い果たされるまで繰り返されます。

関連情報