文字列内の2文字のペアの順序を変更するには?

文字列内の2文字のペアの順序を変更するには?

任意の長さの16進文字列で、文字1と2、3と4などを自動的に置き換えようとしています。

例:

A627E39B

になる:

6A723EB9

これは、sedまたは他の* nixテキストユーティリティのいずれかを使用して可能になるようですが、これまでのところ例は見つかりませんでした。

答え1

逆参照を使用できます。

echo A627E39B | sed 's/\(.\)\(.\)/\2\1/g'

その後、両方の文字が現れることを見つけて、それらを置き換えます。

〜のようにグレンジャックマン拡張正規表現を有効にすると指摘しました(-Etoybox sedGNU、BSD、またはsを含む)括弧をエスケープしないようにするには:

echo A627E39B | sed -E 's/(.)(.)/\2\1/g'

答え2

ddこの機能を基本的にサポートするツールがあります swab南西タイル第二ytes)変換:

% echo ABCD | dd conv=swab
BADC
0+1 records in
0+1 records out
5 bytes (5 B) copied, 0.000109277 s, 45.8 kB/s

2> /dev/nullログ出力を削除するには、以下を追加する必要があります。

% echo ABCD | dd conv=swab 2> /dev/null
BADC

警告:偶数の(印刷可能な)文字を送信すると、必要に応じてほぼ行われます。ただし、印刷可能な文字数を奇数で指定した場合は2とします。N+1 — 次に、末尾のdd改行文字を (2 とします。N+2)文字を入力して(2)番目の文字に置き換えます。N+1 。だから、

% echo ABCDE | dd conv=swab 2> /dev/null

送る

                A B C D E \n

dd、これはあなたに提供されます

                B A D C \n E

バックアップしてみてください。

BADC
E

最後に改行を抑制するオプションを指定することで、-nこの問題を解決できます(または改行を追加せずに使用)。出力を画面に表示する場合は、完全性のために末尾に改行を追加する必要があります。echoprintf

% echo -n ABCDE | dd conv=swab 2> /dev/null; echo
BADCE

% printf "%s" ABCDE | dd conv=swab 2> /dev/null; printf "\n"
BADCE

答え3

以下も使用できますperl

$ echo A627E39B | perl -CLS -nle 'print map {~~reverse} unpack "(a2)*"'
6A723EB9

関連情報