trコマンドとsed(y)コマンドの動作の同じところ、違うところ
はじめに
tr コマンドは、「文字」を別の「文字」に置き換えるコマンドです。
同じようなコマンドとして、 sed コマンドの y 内部コマンドがあります。
両方のコマンドの挙動を紹介します。
検証環境
$ uname -moi
x86_64 x86_64 GNU/Linux
$ head -n 2 /etc/os-release
NAME="Ubuntu"
VERSION="21.04 (Hirsute Hippo)"
$ bash -version | head -n 1
GNU bash, バージョン 5.1.4(1)-release (x86_64-pc-linux-gnu)tr コマンド
tr コマンドを使って、 "my name is test." という文字を変換してみます。
tr コマンドは指定された複数の文字を、別の文字に変換するコマンドです。
具体例をもとに挙動を見ていきましょう。
例1
tr コマンドの第1引数と第2引数の文字数が同じ場合には、それぞれの文字位置が変換ルールとして対応します。
以下のルールで変換されます。
t=>ae=>bs=>c
$ echo 'my name is test.' | tr 'tes' 'abc'
my namb ic dbcd.例2
tr コマンドの第2引数が第1引数の文字数よりも小さい場合は、
以下のルールで変換されます。
t=>ae=>bs=>b( 最後の変換後文字が利用される )
$ echo 'my name is test.' | tr 'tes' 'ab'
my namb ib abba.例3
変換前の文字として同じものが複数登場した場合には、以下のルールで変換されます。
t=>ae=>bs=>ct=>d( 後勝ちとなり、こちらのルールが優先される )
$ echo 'my name is test.' | tr 'test' 'abcd'
my namb ic dbcd.sed (y) コマンド
今度は sed コマンドの例を見ていきます。
例1
sed コマンドの第1引数と第2引数の文字数が同じ場合には、それぞれの文字位置が変換ルールとして対応します。
以下のルールで変換されます。
t=>ae=>bs=>c
$ echo 'my name is test.' | sed 'y/tes/abc/'
my namb ic abca.例2
sed コマンドの第1引数と第2引数の文字数が異なる場合には、エラーとなります。
$ echo 'my name is test.' | sed 'y/tes/ab/'
sed: -e expression #1, char 9: `y' コマンドに対する文字列の長さが異なります
$ echo 'my name is test.' | sed 'y/te/abc/'
sed: -e expression #1, char 9: `y' コマンドに対する文字列の長さが異なります例3
変換前の文字として同じものが複数登場した場合には、以下のルールで変換されます。
t=>a( 先勝ちとなり、こちらのルールが優先される )e=>bs=>ct=>d
$ echo 'my name is test.' | sed 'y/test/abcd/'
my namb ic abca.ひとこと
個人的には tr コマンドは「変換文字数が間違っていた」場合
や「後勝ちで当初想定していたルールが上書きされてしまう」場合の挙動が直感的ではなく、sed 'y/.../.../' コマンドのほうが好みです。
とはいえ、 sed 'y/.../.../' コマンドを利用しているコードはほぼ見たことがありません。




ディスカッション
コメント一覧
まだ、コメントがありません