파일에서 주어진 문자만 유지하는 방법은 무엇입니까?

파일에서 주어진 문자만 유지하는 방법은 무엇입니까?

목적:

tr -cd '\12\40-\176'

그러나 악센트 표시가 있는 경우(예: á, í, ű, ö, ö, ü, ű, ú, ó, é).

8진수로 표현:

"á" is 341
"\n" is 12

그래서 나는 다음을 시도한다:

[user@notebook ~]$ printf 'XXXá\nXXX' | tr -cd '\12\341' | cat -vte -
$
[user@notebook ~]$ 

질문: 왜 출력에 "á"를 남기지 않습니까? 어쩌면 확장된 ASCII 테이블 문자나 다른 것에 대해 모르나요?

고쳐 쓰다:

[user@notebook small]$ printf 'árvíztűrő tükörf\túrógép\n' | strings -eS -n1
árvíztűrő tükörf    úrógép
[user@notebook small]$ 

탭은 필수가 아니지만 문자열이 탭을 그대로 유지합니다.

업데이트 #2:

[user@notebook ~]$ locale -a | grep hu_HU.utf8
hu_HU.utf8
[user@notebook ~]$ printf 'someárvíztűrő tükörf\túrógép\ntext' | LANG=hu_HU.utf8 sed 's/[\d128-\d255]//g;s/[\d000-\d031]//g' | cat -vte -
sed: -e expression #1, char 19: Invalid collation character
[user@notebook ~]$ 

답변1

"á"는 341입니다.

아니요, 그렇지 않습니다. 문자 세트는 UTF-8입니다. 여기서 á는 U+00E1 문자이며 2바이트 시퀀스 \xc3\xa1= 로 인코딩됩니다 \303\241. \341매개변수를 쓰면 tr바이트로 해석됩니다 \341.

확장된 ASCII 테이블 문자에 대해 알지 못합니다.

예, 그렇습니다. "확장 ASCII 테이블 문자"와 같은 것은 없습니다. ASCII는 7비트 문자 집합입니다. 확장된 ASCII 문자 세트를 참조하고 있으며 tr실제로 지원됩니다. tr현재 로케일에 따라 문자 또는 바이트를 처리합니다.

tr -cd '\12\40-\176'ASCII에서는 인쇄 가능한 문자와 개행 문자를 보존한다는 의미입니다. 모든 로캘에서 '인쇄 가능한 문자'를 말할 수 있습니다 [:print:]. \n줄 바꿈을 나타내는 더 명확한 방법입니다. 그러므로:

tr -cd '\n[:print:]'

불행하게도 일부 구현 tr(GNU 버전 포함)에서는 UTF-8의 문자 집합을 처리할 수 없습니다. 대신 sed를 사용할 수 있습니다.

sed 's/[^[:print:]]//g'

답변2

strings예를 들어 사용하십시오 .

$ printf 'XXXhelloá\nYYY' | strings -es -n1
XXXhello
YYY

man stringsstrings에는 입력 문자열이나 파일(-es, 7비트 문자만 포함)에서 텍스트를 추출하기 위한 다양한 옵션(자세히 알아보기)이 있습니다 .

더 많은 "특수" 문자를 제외하려면 sed를 사용할 수 있습니다.

# printf 'someárvíztűrő tükörf\túrógép\ntext' | LANG=C sed 's/[\d128-\d255]//g;s/[\d000-\d031]//g' | cat -vte -
somervztr tkrfrgp$
text$

한 줄에 텍스트를 결합하려면 xargs를 통해 텍스트를 파이프하면 모든 줄 바꿈이 공백으로 대체됩니다.

$ printf 'someárvíztűrő tükörf\túrógép\ntext' | xargs | LANG=C sed 's/[\d128-\d255]//g;s/[\d000-\d031]//g;s/\n//g' | cat -vte -
somervztr tkrf rgp text$

관련 정보