特定の文字を1対1に変換して、一部の文字を変更せずに他の文字を同じターゲット文字に置き換える方法は?

特定の文字を1対1に変換して、一部の文字を変更せずに他の文字を同じターゲット文字に置き換える方法は?

次のファイルがありますfile.txt

MAL TIRRUEZF CR MAL RKZYIOL EX MAL OIY UAE RICF "MAL ACWALRM DYEUPLFWL CR ME DYEU MAIM UL IZL RKZZEKYFLF GH OHRMLZH"

文字を次のように変更したいと思います。

M = T
A = H
L = E
C = O
R = F
E = I
X = S
(Any other letter) = _
(Anything else) = (itself)

固定文字のオーバーライドがあります。

tr MALCREX THEOFIS < file.txt

または:

sed 'y/MALCREX/THEOFIS/' < file.txt

しかし、私が言及した最後の2つの規則をどのように実施できますか?

ベストアンサー1

tr多くの実際の実装では、文字が最初のセットで繰り返されると、最後のインスタンスが適用されるという事実を利用できると思います。繰り返し構文と組み合わせると、変換テーブルに表示されない文字を明示的に一覧表示することなくこれを行うことができます。

trのGNUバージョンと私のMacのFreeBSDベースのバージョンの場合:

tr 'A-ZMALCREX' '[_*26]THEOFIS'

回転する

MAL TIRRUEZF CR MAL RKZYIOL EX MAL OIY UAE RICF "MAL ACWALRM DYEUPLFWL CR ME DYEU MAIM UL IZL RKZZEKYFLF GH OHRMLZH"

入力する

THE __FF_I__ OF THE F_____E IS THE ___ _HI F_O_ "THE HO_HEFT __I__E__E OF TI __I_ TH_T _E __E F___I___E_ __ __FTE__"

もちろん、これはA-Z正確に26文字が生成されると仮定し、これがすべてのtr実装のすべてのロケールで機能するかどうかはわかりません。とにかく、trのGNUバージョンは生の8ビット文字のみをサポートしているため、Cロケールで動作する必要があります。

上記のコードはBusyboxでは動作しません。これは重複した構文をサポートしていないためです。手動で行う必要があります。

busybox tr 'A-ZMALCREX' '__________________________THEOFIS'

(つまり、下線26本)

単純なテーブルベースの実装では、同じ文字の初期インスタンスを繰り返し文字で上書きするのは当然です。実装が異なる場合は、tr異なる回答のソリューションを使用する必要があります。

おすすめ記事