trを使用すると、奇妙な動作を示す特定のサーバーがあります。以下は、稼働中のサーバーの例です。
-bash-3.2$ echo "abcdefghijklmnopqrstuvwxyz1234567890"|tr -d [a-z]
1234567890
-bash-3.2$
これは私にとって完全に理解されています。
ただし、これは「特殊」サーバーからのものです。
[root@host~]# echo "abcdefghijklmnopqrstuvwxyz1234567890"|tr -d [a-z]
abcdefghijklmnpqrstuvwxyz1234567890
ご覧のとおり、すべての小文字を削除すると失敗します。ただし、文字「o」は削除されます。
興味深い部分は次の2つの例ですが、私には理解できません。
[root@host~]# echo "abcdefghijklmnopqrstuvwxyz1234567890"|tr -d [a-n]
opqrstuvwxyz1234567890
[root@host~]# echo "abcdefghijklmnopqrstuvwxyz1234567890"|tr -d [a-o]
abcdefghijklmnpqrstuvwxyz1234567890
[root@host~]#
(最後の例では「o」が削除されました)
ここで何が起こっているのか知っている人はいますか?私が使用している他のLinuxボックスではそれを再現することはできません。
ベストアンサー1
o
現在のディレクトリには次のファイルがあります。
foo> ls
foo> echo "abcdefghijklmnopqrstuvwxyz1234567890"|tr -d [a-z]
1234567890
foo> touch o
foo> echo "abcdefghijklmnopqrstuvwxyz1234567890"|tr -d [a-z]
abcdefghijklmnpqrstuvwxyz1234567890
[a-z]
一致するものが見つかると、シェルは文字列を展開します。
これをパス名拡張と呼びます。man bash
パス名拡張
語を分離した後、bashは-fオプションが設定されていない限り、文字*、?と[について各単語を検索します。 ...(...)
bash が拡張を実行します。
[...]は含まれている文字の1つと一致します。