「x」文字より小さいテキストファイルのすべての行を削除する方法は?

「x」文字より小さいテキストファイルのすべての行を削除する方法は?

テキストファイルから文字、数字、または記号が「x」より少ない行をすべて削除するにはどうすればよいですか?awk 'length($0)>'スペースが含まれているため使用できません。

答え1

nグラフィック記号未満を含む行を削除するとします。

awk -v n=5 '{ line = $0; gsub("[^[:graph:]]", "") } length >= n { print line }'

一致しないすべての文字が削除されます[[:graph:]]。残りの文字列の長さがより大きいか等しい場合は、n(修正されていない)行を印刷します。

値はnコマンドラインに提供されます。

[[:graph:]]と同じで、[[:alnum:][:punct:]]と同じです[[:alpha:][:digit:][:punct:]]。スペースとほぼ同じ[[:print:]]ですが、スペースと一致しません。

[^[:graph:]]すべてのタブまたはスペースを削除する代わりに、すべてのタブまたはスペースを削除するために使用できます[[:blank:]]

sed上記のコードとほぼ同じです。awk

sed -e 'h; s/[^[:graph:]]//g' \
    -e '/.\{5\}/!d; g'

または単純化するため(空白以外の文字のみを計算)

sed -e 'h; s/[[:blank:]]//g' \
    -e '/...../!d; g'

まず、現在の行を予約済みスペースに保存しますh。次に、その行からグラフィック以外の文字(または2番目のバリアントの場合は空白文字)をすべて削除しますs///g。線に5文字未満が含まれている場合(希望の数に変更するか、2番目のバリエーションでポイント数を変更)、線は削除されます。それ以外の場合は、保存された行が予約済みスペースから取得されg(暗黙的に)印刷されます。

答え2

sed -e 's/[^[:space:][:cntrl:]]/&/20' -e t -e d < file

file空白以外の20個以上の非制御文字を含む行を印刷します(または[[:graph:]]説明[[:alnum:][:punct:]]にどの文字を含めるか除外するかは不明です。一部のシステムでは、改行ではない空白文字が含まれますが含まれていませんgraph)。含まれていますspace)。

アイデアは、空白ではなく/制御文字の20番目の発生を独自に()置換しようとし、置換が成功した場合は()&分岐tし、そのd操作をスキップすることです(削除)。

これにより、awk次のことができます。

awk 'gsub(/[^[:space:][:cntrl:]]/, "&") >= 20' < file

gsub()置き換えた回数を返すという事実に依存します。

そしてgrep

grep -E '^([[:space:][:cntrl:]]*[^[:space:][:cntrl:]]){20}' <  file

(.*[^[:space:][:cntrl:]]){20}可能ですが、より高価です)。

答え3

これにより、10 文字から 10 文字未満の行が削除されます。

sed -E '/^.{1,11}$/d' filename

または

sed -r '/^.{1,11}$/d' filename  

スペースを切り捨てるには、次を使用できます。

sed -E 's/^[[:space:]]*//g;s/[[:space:]]*$//g;/^.{1,11}$/d' filename

ファイル内から直接削除するには、次を使用します。-私それとしてオプション。

答え4

Rakuを使う(古いPerl6)

raku -ne '.put if chars( S:g/\s// ) >= 10;'  filename

または

raku -ne '.put unless chars( S:g/\s// ) < 10;'  filename

または

raku -ne '.put unless chars( S:g/\W// ) < 10;'  filename

または

raku -ne '.put unless chars( S:g/<ws>// ) < 10;'  filename

簡単に言うと、Raku / Perl6では、「n」と同様に、S///望ましくない文字(スペースなど)なしで結果文字列を生成するために「capital-S」演算子が使用されます。charsたとえば、10を使用)、最後にブール値が満たされると、.put元の行がそのまま返されます。

注1: "S/// は s/// 演算子と同じ意味を使用しますが、元の文字列をそのままにして $/ の代わりに結果文字列を返します ($/ はまだ s/// と同じ値に設定されます)。"

https://docs.raku.org/言語/regexes#S///__non-breaking_substitution

注2:Raku / Perl6では、正規表現修飾子(「global」など)は副詞と呼ばれ、(通常):gor演算子の先頭、または直後に配置されます。S///s///Ss

注3:.Raku / Perl6のドットはテーマ変数のメソッドを呼び出すために使用されるため、$_コードの最初の「単語」は.put本質的に略語です$_.put

https://docs.raku.org/言語/5to6-nutshell#-%3E_Method_calls

注4:Raku / Perl6には、より制限された一連のコマンドラインフラグがあります。-eコマンドラインからRaku / Perl6コードを実行するには、フラグ(「実行」)を使用してください。この-nフラグはRaku / Perl6コードを1行ずつ実行します。つまり、入力ファイルの各行に対して一度に1行ずつ実行し、結果を返します。 2つのフラグを1つの-neフラグにまとめることができますが、いずれにせよ-eフラグを最後に配置する必要があります。

Perl_6リンク:
https://docs.raku.org/言語/5to6-nutshell#Command-line_flags
https://github.com/rakudo/rakudo/wiki/Running-rakudo-from-the-command-line

関連情報