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