2017.06.01
カテゴリ:シェルスクリプト
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