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

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

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

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"]}'

答え2

-name '*'必要なだけ処理する必要はありません。すべてファイル(*とにかくすべてのファイルと一致するため、違いはありません)。しかし、おそらく-type f(ディレクトリなどではない)通常のファイルだけを扱いたいと思います。

文字以外のものを削除するには、次を使用できます。

tr -cd '[:alpha:]' <file

-c指定された文字セットを補完し、[:alpha:]アルファベット文字のみを一致させます。一致する-d文字を削除することを示しますtr

したがって、実行したいコマンドは次のようになります。

tr -cd '[:alpha:]' <file | wc -m

各ファイルに。

自分で行うには複雑すぎるので、findインラインスクリプトを使用する必要があります。

find . -type f -exec sh -c '
    for pathname do
        tr -cd "[:alpha:]" <"$pathname" | wc -m
    done' sh {} +

ここで、インラインsh -cスクリプトはバッチファイルパス名をパラメータとして取得しますfind。パイプラインは各ファイルに対して実行されます。

答え3

使用幸せ(以前のPerl_6)

~$ raku -e 'S:g/ <-alpha> //.put given lines;'  file

#OR

~$ raku -e 'S:g/ <- :L > //.put given lines;'  file

または:

~$ raku -e 'S:g/ <-alpha> //.put given slurp;'  file

#OR

~$ raku -e 'S:g/ <- :L > //.put given slurp;'  file

Rakuは組み込みのUnicodeの高度なサポートを提供しているため、マルチバイト文字を計算するために外部ライブラリをロードする必要はありません。正規表現文字クラスは:LUnicode 文字を表し、置換<- :L >時に Unicode 文字を「除外した」すべての文字が削除されるという意味です。

入力例(最初の行には〜6個のスペースがあり、6行目には〜12個のスペースがあります):

AAA     
AA1234

ÀÁÂÃÄÅÆ
1234
       
AAAA

出力例:

AAAAAÀÁÂÃÄÅÆAAAA

文字数を計算します。

~$ raku -e 'S:g/ <- :L > //.raku.put given lines;'  file
"AAAAAÀÁÂÃÄÅÆAAAA"
~$ raku -e 'S:g/ <- :L > //.chars.put given lines;'  file
16
~$ raku -e 'S:g/ <- :L > //.comb.elems.put given lines;'  file
16

https://docs.raku.org/言語/unicode
https://raku.org

関連情報