ワークフロー(ファイル)から非ASCII文字をすべて削除します。

ワークフロー(ファイル)から非ASCII文字をすべて削除します。

ファイルから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

おすすめ記事