たとえば、一部の無効な文字を含む大容量(〜180 MB)xmlファイルがあります。
<Data ss:Type="String">7402953^@</Data>
この^@
部分を削除する必要があります。この作業は完了する必要があります
sed -i 's/\^@//g' /tmp/large.xml
ただし、不明な理由で文字列が私の大きなXMLファイル内にある場合、期待どおりに機能しません。ファイルサイズがほんの数KBにすぎない場合は、sed
正しく機能します。
バグのように見えますが、作業があまりにも明白なので不可能だと思います。私は何が間違っていましたか?
答え1
あなたの質問によると、(例がないため)^@
大きなファイルでは、実際には2文字(^
および@
)ではなく印刷できない文字の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
「各行で基本的な操作(印刷など)を行います」を意味します。