
目的:
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'
答え2
strings
たとえば、使用してください。
$ printf 'XXXhelloá\nYYY' | strings -es -n1
XXXhello
YYY
man strings
文字列には、入力文字列またはファイル(-es、7ビット文字のみを含む)からテキストを抽出するためのさまざまなオプション(詳細)があります。
より多くの「特殊」文字を除外するには、sedを使用できます。
# printf 'someárvíztűrő tükörf\túrógép\ntext' | LANG=C sed 's/[\d128-\d255]//g;s/[\d000-\d031]//g' | cat -vte -
somervztr tkrfrgp$
text$
1行にテキストを結合するには、xargsを介してテキストをパイプすると、すべての改行が空白に置き換えられます。
$ printf 'someárvíztűrő tükörf\túrógép\ntext' | xargs | LANG=C sed 's/[\d128-\d255]//g;s/[\d000-\d031]//g;s/\n//g' | cat -vte -
somervztr tkrf rgp text$