여러 파일 및 여러 디렉터리 제거^@

여러 파일 및 여러 디렉터리 제거^@

여러 하위 디렉터리에 여러 파일이 있고 제어 문자 "^@"의 모든 인스턴스를 제거해야 합니다. 기본적인 것만으로 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$

관련 정보