私のファイルにどの制御文字があるのか知りたいです。特定の文字を検索するものではありませんが、可能で\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データに関するものであれば(json
pythonパッケージがこのエラーメッセージを報告することが知られている)、次のように制御文字を含む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はバイト数で報告します。