任意の長さの16進文字列で、文字1と2、3と4などを自動的に置き換えようとしています。
例:
A627E39B
になる:
6A723EB9
これは、sedまたは他の* nixテキストユーティリティのいずれかを使用して可能になるようですが、これまでのところ例は見つかりませんでした。
答え1
逆参照を使用できます。
echo A627E39B | sed 's/\(.\)\(.\)/\2\1/g'
その後、両方の文字が現れることを見つけて、それらを置き換えます。
〜のようにグレンジャックマン拡張正規表現を有効にすると指摘しました(-E
toybox
sed
GNU、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
この問題を解決できます(または改行を追加せずに使用)。出力を画面に表示する場合は、完全性のために末尾に改行を追加する必要があります。echo
printf
% 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