ファイル内の制御文字を見つけるには?

ファイル内の制御文字を見つけるには?

私のファイルにどの制御文字があるのか​​知りたいです。特定の文字を検索するものではありませんが、可能で\tあるか\n。私には、次の内容を知らせるプログラムがありますInvalid control character。しかし、ファイルを開くと何も見えません。このキャラクターをどのように表現しますか?スペースを追加する文字が\n疑われます。\t

私は試しましたが、grep '\n' myfile.txt出力にn文字が表示されました。

答え1

特定の文字を探す

grepまた、sed制御文字のバックスラッシュ表記はサポートされていません。 (sed正規表現はバックスラッシュを使用します。逆参照.) 使用中の場合bash それバックスラッシュシーケンスは、次の(または任意の)プログラムに渡される前に実際の制御文字に変換できます。

$ grep $'\t' file
$ sed -n /$'\t'/p file
$ # or change to l (ell) to visibly show the control character(s)
$ sed -n /$'\t'/l file

OTOHawkこの表記は実際に移植可能にサポートされています。

$ awk '/\t/' file

制御文字の検索

grep補完文字クラス/範囲をすべて検索でき、sed次を含む行を探します。どの「印刷可能」(グラフィックまたはスペース) ASCII 文字以外の文字です。 (ファイルの行を区切る改行は考慮されません。存在する行なので、この一致は満たされません。ただし、Windowsまたはtelnet/SMTP/etcスタイルCRLFを含むファイルがある場合は、CR〜するすべての行が一致するため、この手法の使いやすさが低下します。 )

 $ export LANG=C # use an ASCII or at least single-byte locale; this is the simplest one
 $ grep '[^ -~]' file
 $ sed -n '/[^ -~]/p' file
 $ # or better (see below)
 $ sed -n '/[^ -~]/l' file 

到着展示する制御文字に加えて、ファイル全体または選択した行にどのような他の制御文字がありますか?SHAwardenが提供するオプション以下も使用できます。

 $ sed -n l [file] # that's ell not one; can merge into the selection as above
 $ cat -vT [file]
 $ # both read stdin if not given a filename 
 $ # and thus can be piped from a selection command above

これらのディスプレイのいくつかは、少なくともバックスラッシュ表記法を使用する。一部文字(\t=tab、\b=backspace)を使用し、他の人は「カラット」(古代では「上向き矢印」)表記法(^I=tab、^H=backspace)を使用します。これはASCII図を参照し、カラット/上矢印は16進数40(8進数100と同じ)を減算または加算することを意味します。

答え2

キャラクターが何であるかを確認するには:

less sourcefile

または

od -c sourceFile

もっと詳しく見るには。

答え3

jsonデータに関するものであれば(jsonpythonパッケージがこのエラーメッセージを報告することが知られている)、次のように制御文字を含むjson文字列を識別できます。

perl -Mcharnames=:full -C -l -0777 -ne '
  while (/"(?:\\.|[^"])*"/g) {
    my $offset = $-[0];
    my $string = $&;
    @ctrl = map {charnames::viacode(ord($_))} $string =~ /\p{PosixCntrl}/g;
    if (@ctrl) {
       print "Offset: $offset, String: $string, Ctrl: ". join "+", @ctrl
    }
  }' file.json

サンプルファイルは次のとおりですfile.json

$ python -c 'import json; import os; print(json.load(file("file.json")))'
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/usr/lib/python2.7/json/__init__.py", line 291, in load
    **kw)
  File "/usr/lib/python2.7/json/__init__.py", line 339, in loads
    return _default_decoder.decode(s)
  File "/usr/lib/python2.7/json/decoder.py", line 364, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/usr/lib/python2.7/json/decoder.py", line 380, in raw_decode
    obj, end = self.scan_once(s, idx)
ValueError: Invalid control character at: line 1 column 22 (char 21)

上記のコードはperl次を返します。

Offset: 19, String: "a  b
c", Ctrl: CHARACTER TABULATION+LINE FEED

Pythonが文句を言う制御文字は、文字列の先頭の後ろのTABの1〜2文字であることがわかります"..."。リモートデバイスはperl文字数で報告し、Pythonはバイト数で報告します。

関連情報