テキストファイルから文字、数字、または記号が「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」など)は副詞と呼ばれ、(通常):g
or演算子の先頭、または直後に配置されます。S///
s///
S
s
注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