$ cat t2.c
xxx
$ grep -Pzo xxx t2.c
xxx
$ grep -Pzo xxx t2.c > out1 && file out1
out1: data
여기서는 (대신 ) out1
이라는 것을 알 수 있습니다 . ASCII 텍스트로 만들려면 어떻게 해야 합니까?data
ASCII text
UPD. -z
여러 줄 일치가 필요합니다. 업데이트된 예는 다음과 같습니다.
$ cat t2.c
xxx
yyy
zzz
$ grep -Pzo '(?s)xxx.*zzz' t2.c
xxx
yyy
zzz
$ grep -Pzo '(?s)xxx.*zzz' t2.c > out1 && file out1
out1: data
답변1
자신의 예를 사용하십시오.
echo xxx >t2.c
grep -Pzo xxx t2.c > out1 && file out1
out1: data
grep -Po xxx t2.c > out1 && file out1
out1: ASCII text
-z
to 플래그는 grep
입력 및 (더 중요한 것은) 출력 모두에 대해 NULL로 끝나는 데이터와 함께 사용하기 위한 것입니다. 문서( man grep
)에서 인용:
-z, --null-data
입력 및 출력 데이터를 일련의 줄로 처리합니다. 각 줄은 개행 문자 대신 0바이트(ASCII NUL 문자)로 끝납니다. -Z 또는 --null 옵션과 마찬가지로 이 옵션은 sort -z와 같은 명령과 함께 사용하여 임의의 파일 이름을 처리할 수 있습니다.
다음 도구를 사용하면 이를 확인할 수 있습니다 od
.
$ od -c out1
0000000 x x x \0
0000004
\0
마지막은 NULL입니다. 이 file
명령은 NULL 문자를 확인하고 파일이 ASCII 또는 다른 유형의 텍스트일 수 없음을 올바르게 결정합니다. 폴백 지점은 un Defined 입니다 data
. 이것이 바로 여러분이 보는 것입니다.
해결책? -z
입력이 NULL로 끝나는 레코드를 제공하려는 경우가 아니면 사용하지 마십시오.그리고출력은 NULL로 끝나는 레코드로 구분될 수도 있습니다. 또는 파일에 저장하기 전에 간단히 NULL을 제거할 수도 있습니다.
$ grep -Pzo xxx t2.c | tr -d '\0' > out1 && file out1
out1: ASCII text, with no line terminators