web-dev-qa-db-ja.com

Bashの文字列からすべての特殊文字を削除する

小文字のテキストがたくさんありますが、問題なのは、特殊文字がたくさんあるということです。すべての特殊文字を数字で削除します。

次のコマンドは十分に強くありません:

tr -cd '[alpha]\n '

Éćščžなどの場合、「?」を返します。しかし、私はそれらのすべてを削除したいです。より強力なコマンドはありますか?

Linux Mint 4.3.8(1)-releaseを使用します

12
Marta Koprivnik

trを使用して、以下のような文字列から印刷可能な文字のみを印刷できます。入力ファイルで次のコマンドを使用するだけです。

tr -cd "[:print:]\n" < file1   

フラグ-dは、入力ストリームの引数で定義された文字セットを削除するためのもので、-cはそれらを補完するためのものです(提供されているものを反転します)。したがって、-cがなければ、コマンドは入力ストリームからすべての印刷可能文字を削除し、それを使用するとnon-printable文字を削除して補完します。また、改行文字\nを保持して、入力ファイルの行末を保持します。これを削除すると、最終的な出力が1行になります。

[:print:]POSIXブラケット式 であり、これは式[:alnum:][:punct:]およびスペースの組み合わせです。 [:alnum:][0-9A-Za-z]と同じであり、文字[:punct:]!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~含みます

24
Inian

私はあなたの質問でテキストがどこから来ているのか正確にはわかりませんが、「小文字のテキストのロット」はspecial.txtと呼ばれるファイルにあると言うことができます。維持したい:

cat special.txt | sed 's/[^a-z  A-Z]//g'

それはthoughで手術をするようなものです。

投稿の別の可能な解決策 ...から非ASCII文字を削除

上記で問題が解決しない場合は、もう少し詳細を提供してください。より実用的な回答を提供できる場合があります。

4

ちょっとだけ追加したかった。以下のコードは、上記で説明したように、すべての文字を削除するより良い仕事をし、それらをスペースに置き換え、同時に改行文字を保持します

    tr -s "[:punct:]" " "

手動入力から-s

入力の最後のオペランド(string1またはstring2)にリストされている文字の複数の出現を、文字の単一インスタンスに絞り込みます。これは、すべての削除と翻訳が完了した後に発生します。