これはgeditエディターからのビューです:
とvimエディターからのビュー:
次に、grepを試行します。Togの代わりにLogを配置すると、grepは正常に実行されましたが、出力が破損しています。
[xiaobai@xiaobai grep]$ grep Tog test
[xiaobai@xiaobai grep]$ grep Log test
Dtring.valueOf
[xiaobai@xiaobai grep]$
そして、私はファイルを猫にします、それも壊れています:
[xiaobai@xiaobai grep]$ cat test
Dtring.valueOf
[xiaobai@xiaobai grep]$
だから私はhexdumpを使用します:
[xiaobai@xiaobai grep]$ hexdump -C test
00000000 4c 6f 67 2e 64 28 22 6d 75 73 69 63 22 2c 20 22 |Log.d("music", "|
00000010 4e 41 56 49 47 41 54 4f 52 3a 20 22 20 2b 20 53 |NAVIGATOR: " + S|
00000020 74 72 69 6e 67 2e 76 61 6c 75 65 4f 66 0d 20 20 |tring.valueOf. |
00000030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 | |
00000040 20 20 20 20 20 20 20 20 20 20 20 20 20 44 0d 0a | D..|
00000050
[xiaobai@xiaobai grep]$
私はそれを絞り込みます:
[xiaobai@xiaobai grep]$ cat test3
D
[xiaobai@xiaobai grep]$ hexdump -C test3
00000000 61 0d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 |a. |
00000010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 | |
00000020 20 44 0d 0a | D..|
00000024
[xiaobai@xiaobai grep]$ echo -e '\x61'
a
[xiaobai@xiaobai grep]$ echo -e '\x61\x0d'
a
[xiaobai@xiaobai grep]$ echo -e '\x61\x0d\x20'
[xiaobai@xiaobai grep]$ echo -e '\x61\x0d\x20\x62'
b
ご覧のとおり、\ x20バイトを1バイト追加すると「a」が消去されます。
だから私の質問は、なぜそれが起こっているのか、そしていくつかのファイルの事前の知識なしにこれを取り除くにはどうすればいいですか?例えばgrep -r?
ASCIIのコード0〜31の文字は制御文字です。ターミナルに送られるとき、それらは特別なことをするために使用されます。たとえば、\a
(BEL、0x7)は端末のベルを鳴らします。\b
(BS、0x8)カーソルを後方に移動します。\n
(LF、0xa)はカーソルを1行下に移動し、\t
(TAB 0x9)はカーソルを次のタブに移動します。
\r
(CR、0xd)カーソルを最初の列に移動します。
ターミナルのシェルプロンプトで実行する場合:
printf 'foo\nbar\n'
printf
に書き込むfoo\nbar\n
と/dev/tty<something>
、そのデバイスのtty行の規律はそれをに変換しfoo\r\nbar\r\n
ます。これが。のbar
次の行に表示される理由ですfoo
。
printf 'foo\rbar\n'
ターミナルをで上書きfoo
しbar
ます。
あなたのファイルは、制御文字が含まれている場合は、どちらかそれらを削除するか、またはそれらを(例えばテキスト表現与えることができる^M
か、\r
あなたが彼らの存在を確認したい場合はCRの0xd文字のために)。
ただし、LF文字とTAB文字についてはこれを実行したくない場合があります。そう:
LC_ALL=C tr -d '\0-\10\13-\37\177' < file # to remove them
cat -v < file # to display as ^M
sed -n l < file # to display as \r (also converts TAB to \t)
# and marks the end of lines with $
それらsed
とcat
1つは非ASCII文字も変換することに注意してください。代わりに次のことができます。
LC_ALL=C sed "$(printf 's/[^\t -\176\200-\377]/^&/g')" < file |
LC_ALL=C tr '\0-\10\13-\37\177' '@-HK-_?'
ASCII制御文字(TABとLFを除く)のみを^X
視覚的な形式にsed
変換します(ただし、すべての実装がNUL文字を含む入力ファイルをサポートしているわけではないことに注意してください)。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加