여러 하위 디렉터리에 여러 파일이 있고 제어 문자 "^@"의 모든 인스턴스를 제거해야 합니다. 기본적인 것만으로 grep
는 작동하지 않는 것 같습니다. 이것이 제가 최근에 시도한 것입니다.
grep -rl '\^@' ./ | xargs sed -i 's/[\^@]//g'
어떤 제안이 있으십니까?
답변1
^@
일반적으로 NUL 문자(바이트 값 0)로 표시됩니다.
GNU가 아닌 많은 텍스트 유틸리티는 이 문제를 텍스트에서 찾을 수 없기 때문에 처리할 수 없습니다.
일부 GNU 버전은 다음 grep
을 통해 찾을 수 있습니다.
grep -P '\0'
GNU는 sed
제거를 사용할 수 있으므로 sed 's/\x0//g'
다음과 같습니다.
grep -rlZP '\0' . | xargs -r0 sed -i 's/\x0//g'
grep
찾을 수 없다면 GNU를 사용해 보세요 awk
:
find . -type f -exec gawk -vORS='\0' '
/\0/{print FILENAME; nextfile}' {} + |
xargs -r0 sed -i 's/\x0//g'
답변2
^@
NUL 바이트(숫자 값 0
)가 일반적으로 표시되는 방법, 예:
$ printf "null\000byte\n" > nullbyte
$ cat -A nullbyte
null^@byte$
이를 처리할 때의 한 가지 문제는 명령줄에서 그대로 전달할 수 없다는 것입니다. 명령줄 인수를 종료하는 데 동일한 바이트가 사용되기 때문에 이는 불가능합니다. 대신 어떻게든 이스케이프 처리해야 합니다(이 방법은 \^@
작동하지 않습니다.)
내 시스템에서 GNU grep이 지원하는 정규식은 이를 처리하는 방법을 제공하지 않는 것 같습니다. 반면에 GNU sed는 를 이해하는 것 같으 \x00
므로 제거할 수 있습니다.
$ sed -e 's/\x00//g' nullbyte |cat -A
nullbyte$
tr
작동하지 않지만 작동해야 합니다 -i
.
$ tr -d '\000' < nullbyte | cat -A
nullbyte$