![tr -c '[a-zA-Z]' '\n' はすべての補足文字を置き換えません。](https://linux33.com/image/76452/tr%20-c%20'%5Ba-zA-Z%5D'%20'%5Cn'%20%E3%81%AF%E3%81%99%E3%81%B9%E3%81%A6%E3%81%AE%E8%A3%9C%E8%B6%B3%E6%96%87%E5%AD%97%E3%82%92%E7%BD%AE%E3%81%8D%E6%8F%9B%E3%81%88%E3%81%BE%E3%81%9B%E3%82%93%E3%80%82.png)
スクリプトを書くときは、アルファ([a-zA-Z])を除くすべての文字を改行にしたいと思います。定義に従って-cフラグ(集合の補数)が使用される場合、trはSET1にないすべての文字をSET2で指定された文字に置き換える必要があります。しかし、期待どおりに動作しません。以下を試してください。
echo '[[:lower:]]' | tr -c '[a-zA-Z]' '\n'
私が得た結果は次のとおりです。
[[
lower
]]
ご覧のとおり、これは列を置き換えますが、角かっこは置き換えません。
誰でもこれを明確にできますか?
答え1
tr
この正規表現スタイルの文字クラスは解釈されません。
[a-zA-Z]
〜と[
範囲の文字セットとして解釈されます。a
z
]
[
したがって、その補足は、すべての文字butとから、およびまでの文字範囲を含む文字セットです。a
z
]
そのため[
交換]
できません。
アルファベット以外の文字を置き換えるには、a-zA-Z
置換セットの補数として指定します。
echo '[[:lower:]]' | tr -c 'a-zA-Z' '\n'
% echo '[[:lower:]]' | tr -c 'a-zA-Z' '\n'
lower
%