ファイルに与えられた文字だけを保持する方法は?

ファイルに与えられた文字だけを保持する方法は?

目的:

tr -cd '\12\40-\176'

ただし、アクセントマークがある場合(例:á、í、ű、ö、ö、ü、ü、ú、ú、ó、é)。

8進数で表現:

"á" is 341
"\n" is 12

だから私は次のことを試みます:

[user@notebook ~]$ printf 'XXXá\nXXX' | tr -cd '\12\341' | cat -vte -
$
[user@notebook ~]$ 

質問:なぜ出力に「á」を残さないのですか?たぶん、拡張ASCIIテーブル文字や他のものについて知りませんか?

修正する:

[user@notebook small]$ printf 'árvíztűrő tükörf\túrógép\n' | strings -eS -n1
árvíztűrő tükörf    úrógép
[user@notebook small]$ 

タブは必須ではありませんが、文字列はタブをそのまま残します。

アップデート#2:

[user@notebook ~]$ locale -a | grep hu_HU.utf8
hu_HU.utf8
[user@notebook ~]$ printf 'someárvíztűrő tükörf\túrógép\ntext' | LANG=hu_HU.utf8 sed 's/[\d128-\d255]//g;s/[\d000-\d031]//g' | cat -vte -
sed: -e expression #1, char 19: Invalid collation character
[user@notebook ~]$ 

ベストアンサー1

「á」は341です。

いいえ、そうではありません。文字セットは UTF-8 です。ここで á は U+00E1 文字で、2 バイトのシーケンス\xc3\xa1= でエンコードされます\303\241\341パラメータを書き込むとtrバイトとして解釈されます\341

拡張ASCIIテーブル文字については不明です。

はい、そうです。 「拡張ASCIIテーブル文字」のようなものはありません。 ASCIIは7ビット文字セットです。拡張ASCII文字セットを参照しており、tr実際にサポートされています。tr現在のロケールに従って文字またはバイトを処理します。

tr -cd '\12\40-\176'ASCIIでは、印刷可能文字と改行文字を保存するという意味です。すべてのロケールで「印刷可能な文字」を話すことができます[:print:]\n改行を表すより明確な方法です。したがって:

tr -cd '\n[:print:]'

残念ながら、一部の実装tr(GNUバージョンを含む)ではUTF-8の文字セットを処理できません。代わりに sed を使用できます。

sed 's/[^[:print:]]//g'

おすすめ記事