アッ

アッ

たとえば、一部の無効な文字を含む大容量(〜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「各行で基本的な操作(印刷など)を行います」を意味します。

関連情報