trを使って複数のグループを変更するには?

trを使って複数のグループを変更するには?

tr交換番号0-5と交換番号を使用したいですA6-9B

私はsedこれを使ってみました:

sed 's/[0-4]/</; s/[6-9]/>/' 

しかし、一度だけ動作するので、たとえば、私が書くと123A23AAA

答え1

の場合は、各行で発生するすべての内容を置き換えるようにsed追加する必要があります。g

sed 's/[0-4]/A/g;s/[5-9]/B/g'

を使用すると、tr2つのsを接続できますtr

tr '0-4' A | tr '6-9' B

または明示的に文字変換を提供します。

tr 0123456789 AAAAABBBBB

でも:

tr 0-45-9 AAAAABBBBB

(ただし、後者は1-1マッピングがすぐに表示されないため、読みやすくはありません.)

繰り返されるBsは短縮され(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 A2番目のグループのサイズが最初のグループのサイズと異なるため、POSIXではありません。
  • tr 0-5 AAAAAAPOSIX/C ロケールでのみ動作が保証されます。
  • sed 's/[0-5]/A/g'[0-5]012345以降と一致できる非POSIXロケールの場合も同様です。

2020年現在trのGNU実装とは異なり、GNU実装はsedマルチバイトをサポートしていないため(一部のレベルのサポートを追加するためのいくつかのパッチがあると思いますが)、trGB18030などの文字セットを使用する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_

関連情報