私のディレクトリには多くのファイルがあり、各ファイルは次のようになります。
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"]}'