앗

예를 들어 일부 잘못된 문자가 포함된 대용량(~180MB) xml 파일이 있습니다.

<Data ss:Type="String">7402953^@</Data>

^@부분을 제거해야 합니다. 이 작업은 완료되어야합니다

sed -i 's/\^@//g' /tmp/large.xml

그러나 어떤 알 수 없는 이유로 문자열이 내 큰 XML 파일 안에 있으면 예상대로 작동하지 않습니다. 파일 크기가 몇 KB에 불과한 경우에는 sed제대로 작동합니다 .

버그처럼 보이지만 작업이 너무 뻔하기 때문에 불가능하다고 생각합니다. 내가 뭐 잘못 했어요?

답변1

귀하의 질문에 따르면(예제가 없기 때문에) ^@큰 파일에서는 실제로 두 문자( ^@)가 아니라 인쇄할 수 없는 문자 중 하나라고 말하고 싶습니다.

Ctrl + v+를 사용하여 터미널에 인쇄할 수 없는 문자를 입력할 수 있습니다 Ctrl + 2. 문자 대신
사용하면 괜찮을 것입니다. sed^@

또한 인쇄할 수 없는 문자에는 필요하지 않으므로 이스케이프 시퀀스를 제거하십시오.

답변2

사용된 솔루션이 허용되는 경우 awk인쇄할 수 없는 모든 문자가 제거됩니다 .

이는 GNU awk(Linux) 및 BSD awk(Mac)에서 작동합니다.

awk '{ gsub(/[^[:print:][:blank:]]/,"",$0) ; print $0 }' input.xml > output.xml
  • gsub(/[^[:print:][:blank:]]/,"",$0)
    각 입력 줄에서 원하지 않는 문자를 제거하십시오.
    • [:print:]
      인쇄 가능한 모든 문자.
    • [:blank:]
      공백 또는 탭.
    • [^[:print:][:blank:]]
      두 카테고리에는 문자가 포함되지 않습니다.
  • print $0
    입력의 각 줄을 인쇄합니다.
  • > output.xml
    출력을 화면에 인쇄하는 대신 파일에 저장합니다.

더 적은 수의 키 입력으로 동일한 작업을 수행합니다(읽기가 조금 더 어려워짐).

awk '{gsub(/[^[:print:][:blank:]]/,"")}1' input.xml > output.xml
  • ,$0전체 라인을 검사하는 경우에는 (전체 라인 입력)을 지정할 필요가 없습니다 .gsub
  • 마지막은 1"이제 각 줄에서 기본 작업(예: 인쇄)을 수행합니다"를 의미합니다.

관련 정보