ファイルからASCII以外の文字をすべて削除するには?これを行う特定のコマンドはありますか?
grep --colour='auto' -P -n'[^\x00-\x7]' /usr/local/...
これにより、ワークフローでキャラクターを見つけることができると思います。しかし、関連キャラクターのすべてのインスタンスをどのように削除しますか?
ベストアンサー1
ASCII文字は0~177(8進数)の範囲の文字(含む)。
ファイルからこの範囲外の文字を削除するには、次のようにします。
LC_ALL=C tr -dc '\0-\177' <file >newfile
このtr
コマンドは単一文字に対して機能するユーティリティです。、または別の単一文字(翻訳)に置き換え、削除、または同じ文字を単一文字に圧縮します。
上記のコマンドは、でfile
変更された内容を読み書きしますnewfile
。この-d
オプションをtr
使用すると、ユーティリティは文字を翻訳するのではなく削除し、指定された間隔-c
の外側(内部ではなく)文字を考慮に入れます。
LC_ALL=C
各バイト値が有効な文字を形成していることを確認してください。これがなければ、一部のtr
実装は、ロケールの文字エンコーディングで有効な文字を形成しないバイトシーケンスを見つけると中断されます。
元のファイルを変更されたファイルに置き換えるには、次を使用します。
LC_ALL=C tr -dc '\0-\177' <file >newfile &&
mv newfile file
tr
正常に完了すると、新しいファイルの名前が古いファイルの名前に変更されます。tr
元のファイルを読み取れないか、新しいファイルを書き込めないために正常に完了しないと、元のファイルは変更されていません。
または、元のファイルのメタデータ(権限など)をできるだけ保存するには、次のようにします。
cp file tmpfile &&
LC_ALL=C tr -dc '\0-\177' <tmpfile >file &&
rm tmpfile