파일에서 제어 문자를 찾는 방법은 무엇입니까?

파일에서 제어 문자를 찾는 방법은 무엇입니까?

내 파일에 어떤 제어 문자가 있는지 알고 싶습니다. 특정 문자를 검색하는 것이 아니지만 가능 \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

OTOH awk이 표기법은 실제로 이식 가능하게 지원됩니다.

$ 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이 불평하는 제어 문자는 string 시작 부분 뒤의 TAB 한두 문자라는 것을 알 수 있습니다 "...". 원격 장치 는 perl문자 수로 보고하는 반면 Python은 바이트 수로 보고합니다.

관련 정보