예를 들어 일부 잘못된 문자가 포함된 대용량(~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
"이제 각 줄에서 기본 작업(예: 인쇄)을 수행합니다"를 의미합니다.