tr -c '[a-zA-Z]' '\n' はすべての補数文字を置き換えません

tr -c '[a-zA-Z]' '\n' はすべての補数文字を置き換えません

スクリプトを書いていて、アルファベット ([a-zA-Z]) 以外のすべての文字を改行に置き換えたいと思いました。定義上、-c フラグ (セット補完) を使用すると、tr は SET1 にないすべての文字を SET2 で指定された文字に置き換えるはずです。しかし、期待どおりに動作しません... これを試してください:

echo '[[:lower:]]' | tr -c '[a-zA-Z]' '\n'

出力は次のようになります:

[[
lower
]]

ご覧のとおり、列は置き換えられますが、置き換えられるはずの角括弧は置き換えられません。

誰かこれを明確に説明できますか?

答え1

trその正規表現スタイルでは文字クラスを解釈しません。

[a-zA-Z]は のセットとして解釈され、 からまで[の文字の範囲と となります。az]

したがって、その補集合は、 を除くすべての文字、からまで[の文字の範囲、およびを含む文字の集合です。az]

そのため[、 と は]置き換えられません。

アルファベット以外の文字を置き換えるには、a-zA-Z置き換える文字セットの補数として指定します。

echo '[[:lower:]]' | tr -c 'a-zA-Z' '\n'
% echo '[[:lower:]]' | tr -c 'a-zA-Z' '\n'



lower



%

関連情報