1つのファイルからすべての非ASCII文字を削除するにはどうすればよいですか?これを実行する特定のコマンドはありますか?
grep --colour='auto' -P -n'[^\x00-\x7]' /usr/local/...
これでワークフロー内のキャラクターが見つかると思いますが、問題のキャラクターのインスタンスをすべて削除するにはどうすればよいですか?
cat -v
それらをASCII表現で表示するために使用できます。(例えば^G
用\007
)
1つのファイルからすべての非ASCII文字を削除するにはどうすればよいですか?これを実行する特定のコマンドはありますか?
grep --colour='auto' -P -n'[^\x00-\x7]' /usr/local/...
これでワークフロー内のキャラクターが見つかると思いますが、問題のキャラクターのインスタンスをすべて削除するにはどうすればよいですか?
cat -v
それらをASCII表現で表示するために使用できます。(例えば^G
用\007
)
回答:
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
必要なのが正規表現[\x00-\x7F]
だけの場合:いくつかのユーティリティに適用できます:
<file LC_ALL=C sed 's/[^\o0-\o177]//g' # GNU sed without POSIXLY_CORRECT
<file LC_ALL=C awk '{gsub(/[^\0-\177]/,"");print}'
<file perl -pe 's/[^[:ascii:]]//g;'
<file LC_ALL=C tr -dc '\0-\177'
sed、awk、perlはUnixで定義されている「テキストファイル」を想定していることを理解してください。この場合、すべてうまくいきます。ただし、具体的には、awkは末尾の新しい行を追加します(ソースファイルに存在するかどうかに関係なく)(printfを使用すると、入力のすべての改行が削除されます)。trは、あらゆる種類のファイルで動作するように設計されています。ただし、NUL(\0
)はPOSIXテキストファイルでは有効な文字ではないため、避ける必要があります。
行にはNUL文字が含まれていません...
実際、多くの制御文字は、特定の条件下で他の問題を生成します。
だから、おそらくあなたが必要です[\x07-\x0d\x20-\x7e]
<file LC_ALL=C sed 's/[^\o007-\o015\o040-\o176]//g' # GNU sed without POSIXLY_CORRECT
<file LC_ALL=C awk '{gsub(/[^\0-\15\40-\176]/,"");print}'
<file perl -pe 's/[^\x{7}-\x{d}\x{20}-\x{7e}]//g;'
<file LC_ALL=C tr -dc '\7-\15\40-\176'
範囲7〜13(10進数)は\a\b\t\n\v\f\r
(順番)です。
同様の(おそらくより移植性の高い)範囲は[^[:space:][:print:]] (similar because it doesn't include
\ a \ b` --bellとbackspace--)と書くことができます。
<file LC_ALL=C sed 's/[^[:space:][:print:]]//g' # GNU sed without POSIXLY_CORRECT
<file LC_ALL=C awk '{gsub(/[^[:space:][:print:]]/,"");print}'
<file perl -pe 's/[^[:space:][:print:]]//g;'
<file LC_ALL=C tr -dc '[:space:][:print:]'
tr
は、テキストファイルだけでなく、任意のタイプのファイルにできることに注意してください。awk
一方、テキストファイルを受け取ります。
gensub()
はgawk拡張機能であることに注意してください。あなたはgsub(...); print
、16進シーケンス(およびLC_ALL = C)の代わりに8進を使用して(より)移植可能にする必要があります。
[^\o0]
バックスラッシュ、POSIXのoおよび0 sed
(GNU sedを除くすべての実装)以外の文字に一致します。これはGNUの制限ではsed
なく、非準拠の拡張機能です。そのため、POSIXLY_CORRECTが環境にある場合は無効になっています。