sed 16進交換の問題

sed 16進交換の問題

dd if=/dev/zero of=file.dd bs=1 count=1テスト目的で1バイトのNULLファイルを作成しました。次のテストで奇妙な結果が得られました。

dd if=file.dd | 
  sed 's/\x5e/X/' | 
  xxd
00000000: 5800              X.

NULLデータストリームから取得する方法はsedx5E

ありがとうございます。

答え1

正規^表現特殊文字は、「行の開始」に対して幅がゼロの一致であり、入力の先頭に暗黙の行があります。したがって、少なくとも1行で構成されていると見なされるすべての入力およびsed(またはほとんどの正規表現ツール)は、これを次のように処理します。

$ printf "\0\0\0" | od -c
0000000   \0  \0  \0
0000003
$ printf "\0\0\0" | sed 's/^/Y/' | od -c
0000000    Y  \0  \0  \0  \n
0000005
$ printf "\0\0\0" | perl -ple 's/^/Y/' | od -c
0000000    Y  \0  \0  \0  \n
0000005

GNUsed追加の合併症治療は\x5e次のとおりです^

$ printf "\0\0\0" | gsed 's/^/Y/' | od -c
0000000    Y  \0  \0  \0
0000004
$ printf "\0\0\0" | gsed 's/\x5e/Y/' | od -c
0000000    Y  \0  \0  \0
0000004

^リテラルを一致させるには、扱わない、または特別に扱わない他の形式を使用する必要があります。^\x5e

$ printf "\0\x5e\0" | gsed 's/[=\x5e]/Y/' | od -c
0000000   \0   Y  \0
0000003
$ printf "\0\x5e\0" | perl -pe 's/\x5e/Y/' | od -c
0000000   \0   Y  \0
0000003

関連情報