ファイルから新しい行、スペースを削除

ファイルから新しい行、スペースを削除

私のディレクトリには多くのファイルがあり、各ファイルは次のようになります。

AAA 
AA

AAAAAA
A


AAAA

私はこれで終わりたいです:

AAAAAAAAAAAAAAAA

私が実行すると、このように:

find ./ -name '*' -exec wc -m {} +

計算される新しい行/スペースの数に応じて、20+ではなく16を返します。

基本的に文字ではなく、ファイルからすべてを削除したいと思います。

ベストアンサー1

ファイルからすべての改行文字を削除すると(最後の文字まで含む)、テキストファイルには改行文字で区切られた一連のテキスト行が含まれているため、テキストファイルではなくなります(ファイルが空でない限り)。

これで、@Kusalanadaが言ったように、アルファベット文字(すべてのアルファベット)を除くすべての文字を削除するには、POSIXlyを使用できますtr -cd '[:alpha:]'

残念ながら、いくつかのtr実装ではGNUを含むtr、マルチバイト文字では機能しません。 UTF-8ロケールは、ASCII文字を除くすべての文字を意味します。

GNUシステムでは、マルチバイト文字をサポートするGNUまたはawkGNUを使用できます。sed

<file sed 's/[^[:alpha:]]//g' | tr -d '\n'

<file awk -v ORS= '{gsub(/[^[:alpha:]]/, ""); print}'

構文はGNUに限定されず、マルチバイト文字をサポートしていないいくつかの非GNU sed/実装を見つけることができます。awkGNU sed/ は、awk少なくとも有効な文字を形成しないバイトシーケンスを削除しません(たとえば、printf 'à b \200\n'UTF-8ロケールへの出力)。

uconvICUプロジェクトでは、次のことができます。

<file uconv -i -x '[^[:Letter:]]>;'

これは、デコードできない入力をスキップするように指示-iします。uconv

ただし、これはUTF-8データに対してのみ機能します。ロケールによって文字かどうかを決定する代わりに、Unicode文字属性(Unicodeの一部のバージョン)を使用することに注意してください。

GNUでは、grep次のことができます。

<file grep -o '[:alpha:]' | tr -d '\n'

またはPCREサポートでビルドする場合(Unicode属性を使用):

<file grep -Po '\pL' | tr -d '\n'

GNUの場合、awk誤った入力をスキップするもう1つの方法は、次の方法を使用することですRS

<file gawk -v RS='[[:alpha:]]' -v ORS= '{print RT}'

gawkファイルを適切に変更するには、次のモジュールを使用できますinplace

gawk -i /usr/share/awk/inplace.awk gawk -v RS='[[:alpha:]]' -v ORS= '{print RT}' file

使用しないでください-i inplace現在の作業ディレクトリから最初に拡張機能をgawkロードしようとすると、誰かがそのディレクトリにマルウェアを植えた可能性があります。システムに付属の拡張プログラムのパスは異なる場合があります。出力を参照してください。inplaceinplaceinplace.awkinplacegawkgawk 'BEGIN{print ENVIRON["AWKPATH"]}'

おすすめ記事