![파일에서 제어 문자를 찾는 방법은 무엇입니까?](https://linux55.com/image/153619/%ED%8C%8C%EC%9D%BC%EC%97%90%EC%84%9C%20%EC%A0%9C%EC%96%B4%20%EB%AC%B8%EC%9E%90%EB%A5%BC%20%EC%B0%BE%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
내 파일에 어떤 제어 문자가 있는지 알고 싶습니다. 특정 문자를 검색하는 것이 아니지만 가능 \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 데이터에 관한 것이라면( 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이 불평하는 제어 문자는 string 시작 부분 뒤의 TAB 한두 문자라는 것을 알 수 있습니다 "..."
. 원격 장치 는 perl
문자 수로 보고하는 반면 Python은 바이트 수로 보고합니다.