tr
交換番号0-5
と交換番号を使用したいですA
。6-9
B
私はsed
これを使ってみました:
sed 's/[0-4]/</; s/[6-9]/>/'
しかし、一度だけ動作するので、たとえば、私が書くと123
。A23
AAA
答え1
の場合は、各行で発生するすべての内容を置き換えるようにsed
追加する必要があります。g
sed 's/[0-4]/A/g;s/[5-9]/B/g'
を使用すると、tr
2つのsを接続できますtr
。
tr '0-4' A | tr '6-9' B
または明示的に文字変換を提供します。
tr 0123456789 AAAAABBBBB
でも:
tr 0-45-9 AAAAABBBBB
(ただし、後者は1-1マッピングがすぐに表示されないため、読みやすくはありません.)
繰り返されるB
sは短縮され(tr
最後の文字は必要に応じて繰り返されます)、範囲をマージできます。
tr 0123456789 AAAAAB
tr 0-9 AAAAAB
より複雑な置換の場合、コマンドを分割すると、目的をより明確にするのに役立ちます。
tr 0123456789 \
AAAAABBBBB
あるいは、この場合、参照範囲が拡張長と一致するという事実を利用してください。
tr '0-4''5-9' \
AAAAABBBBB
例の最初のコマンドに示すように、均等に分割するために、範囲分割が0-4と5-9であると仮定しますsed
。範囲は必要に応じて調整できます。
答え2
/g
すべての文字に対してグローバル置換を実行するには、最後に数量子を使用します。これがなければ、置換は最初の一致文字で終わり、いいえそれから続けてください。
sed
文字を翻訳する別の方法(と同様tr
)は、GNUとPOSIXの両方で使用できます。
sed 'y/123456789/AAAAABBBB/'
答え3
POSIX的に:
tr 0123456789 AAAAAABBBB
tr 0123456789 '[A*6][B*4]'
tr 0123456789 '[A*6][B*]'
sed 's/[012345]/A/g; s/[6789]/B/g'
sed 'y/0123456789/AAAAAABBBB/'
いくつかの注意:
tr 012345 A
2番目のグループのサイズが最初のグループのサイズと異なるため、POSIXではありません。tr 0-5 AAAAAA
POSIX/C ロケールでのみ動作が保証されます。sed 's/[0-5]/A/g'
[0-5]
012345以降と一致できる非POSIXロケールの場合も同様です。
2020年現在tr
のGNU実装とは異なり、GNU実装はsed
マルチバイトをサポートしていないため(一部のレベルのサポートを追加するためのいくつかのパッチがあると思いますが)、tr
GB18030などの文字セットを使用するGNUではこれらのメソッドを使用できません。ほとんどの文字エンコーディングに10進エンコーディングが含まれるロケールシステムです。
たとえば、
$ printf '%s\n' "$LANG"
zh_CN.gb18030
$ locale charmap
GB18030
$ locale title
Chinese locale for Peoples Republic of China
$ tr --version
tr (GNU coreutils) 8.30
[...]
$ sed --version
sed (GNU sed) 4.7
[...]
$ echo '£12' | tr 0123456789 '[A*6][B*4]'
丄凙AA
$ echo '£12' | sed 'y/0123456789/AAAAAABBBB/'
£AA
これは£
、(ポンド記号)がバイト0x81 0x30 0x84 0x35でエンコードされるためです。ここでは0x30度のエンコーディング0
、0x35もエンコーディングです5
。
$ echo '£12' | LC_ALL=C od -vtx1 -tc
0000000 81 30 84 35 31 32 0a
201 0 204 5 1 2 \n
0000007
$ echo '£12' | tr 0123456789 '[A*6][B*5]' | LC_ALL=C od -vtx1 -tc
0000000 81 41 84 41 41 41 0a
201 A 204 A A A \n
0000007
答え4
範囲が 0-4 と 5-9 であると仮定します。
tr 0-9 AAAAAB
または
sed y_0123456789_AAAAABBBBB_