trコマンドでの勘違い

Tag: シェルスクリプト

Linux系OSのシェルで利用出来るコマンドにtrがある。manで調べると、「translate or delete characters」ということらしい。

個人的には、テキストファイルの改行コードを変換する時に

$ tr -d \\r < crlf.txt > lf.txt

または、

$ tr -d "\r" < crlf.txt > lf.txt

単純なcsvデータのカンマ「,」をタブ記号に変換

$ tr  , \\t < kanma.txt > tab.txt

または、

$ tr  "," "\t" < kanma.txt > tab.txt

これを

"tanaka","1111","2222" 
"yamada","1234","4444"

をダブコーテーションも一緒に処理してタブ区切りにするために、

$ tr  '","' '\t' < kanma.txt  | tr -d '"' > tab.txt

は出来ない。「'","'」では、シングルコーテーションで囲まれた文字のそれぞれを、タブ記号に変換するという意味になる。

例えば、

$ echo "1234567890 1111 2222 abcdefg aabbccddee" | tr  "123" "abc"
abc4567890 aaaa bbbb abcdefg aabbccddee

となり、tr で 一つ目の文字の個数が少ない場合、一つ目が3個で2つ目が、1個なら

$ echo "1234567890 1111 2222 abcdefg aabbccddee" | tr  "123" "a"
aaa4567890 aaaa aaaa abcdefg aabbccddee

2つ目の文字数が2個なら、

$ echo "1234567890 1111 2222 abcdefg aabbccddee" | tr  "123" "a"
aaa4567890 aaaa aaaa abcdefg aabbccddee

連続する文字列は、うっかりtrなどでやってしまわないように、
trでなく、sedなどを使って変換すべきなのです。

$ echo "1234567890 1111 2222 abcdefg aabbccddee" | sed -e "s/123/abc/g"
abc4567890 1111 2222 abcdefg aabbccddee

$ echo "1234567890 1111 2222 abcdefg aabbccddee" | sed -e "s/123/ZZZZZZZZZZ/g"

ZZZZZZZZZZ4567890 1111 2222 abcdefg aabbccddee

    コメント


    認証コード9944

    コメントは管理者の承認後に表示されます。