私のディレクトリには多くのファイルがあり、各ファイルは次のようになります。
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またはawk
GNUを使用できます。sed
<file sed 's/[^[:alpha:]]//g' | tr -d '\n'
<file awk -v ORS= '{gsub(/[^[:alpha:]]/, ""); print}'
構文はGNUに限定されず、マルチバイト文字をサポートしていないいくつかの非GNU sed
/実装を見つけることができます。awk
GNU sed
/ は、awk
少なくとも有効な文字を形成しないバイトシーケンスを削除しません(たとえば、printf 'à b \200\n'
UTF-8ロケールへの出力)。
uconv
ICUプロジェクトでは、次のことができます。
<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
ロードしようとすると、誰かがそのディレクトリにマルウェアを植えた可能性があります。システムに付属の拡張プログラムのパスは異なる場合があります。出力を参照してください。inplace
inplace
inplace.awk
inplace
gawk
gawk '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の高度なサポートを提供しているため、マルチバイト文字を計算するために外部ライブラリをロードする必要はありません。正規表現文字クラスは:L
Unicode 文字を表し、置換<- :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