制御文字処理

制御文字処理

hex \u0003などの見えない制御文字を含むログファイルがあります。

SEDのようなものに置き換えたいのですが、一致する正規表現の最初の部分を取得することはできません。

/s/^E/some_string

「man ascii」ページで読み取ったように、CTRL-V CTRL-0 CTRL-3を押して特殊文字^ Eを作成しました。

003 3 03 ETX

ただし、対応する制御文字に一致する項目はありません。

助けてくれてありがとう!

答え1

このコマンドを使用することもできますtr。たとえば、

制御文字の削除:

tr -d '\033' < file

制御文字を別の制御文字に置き換えるには、次のようにします。

tr '\033' 'x' < file

制御文字の値が何であるかわからない場合は、8進ダンプを実行するとその値が印刷されます。

$ cat file
hello
^[
world

$ od -b file    
0000000 150 145 154 154 157 012 033 012 167 157 162 154 144 012
0000016

したがって、制御文字の^[値はです\033

答え2

この perl one-liner はアクションを実行します。ファイルを変更することに注意してください。

perl -i -pe 's#\x{0003}#some_string#g' /path/to/log/file

複数の文字を指定された範囲の文字コードに置き換えるには、次のようにします。

echo {A..Z} | perl -i -pe 's#[\x{0040}-\x{0047}]#P#g'
P P P P P P P H I J K L M N O P Q R S T U V W X Y Z 

エコ {A..Z}Bashでアルファベット文字列を生成する)

答え3

印刷できないすべての文字は、次に置き換えられます。#

sed 's/[^[:print:]]/#/g' logfile

答え4

何が欲しいのかわかりませんが、連続した16進バイト0x00 0x03を変更すると、次のように動作します。

$ echo '0 61 20 00 03 0A' | xxd -r | sed 's/\x00\x03/test/g' 
a test

関連情報