如何刪除文字檔案中少於“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。然後,它刪除 行上的所有非圖形字元(或第二個變體中的空白字元)s///g。如果該行包含的字元少於 5 個(將其變更為您想要的任何數字,或變更第二個變體中的點數),則該行將被刪除。否則,將從保留空間中取得儲存的行並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(née 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 中,「大寫-S」S///運算子用於產生沒有不需要的字元(例如空格)的結果字串,使用該chars函數對結果字串的字元進行計數,與「n 」(使用10作為一個例子),最後——如果布林值滿足——.put將完整地傳回原始行。

註1: 「S/// 使用與 s/// 運算子相同的語義,但它保留原始字串完整並傳回結果字串而不是 $/($/ 仍設定為與 s/// 相同的值) 」。

https://docs.raku.org/language/regexes#S///_non-breaking_substitution

註 2:在 Raku/Perl6 正規表示式修飾符(如「全域」)中稱為副詞,並且(通常)放置在or運算子:g的開頭,緊接在or之後。S///s///Ss

註 3:.Raku/Perl6 中的點用於呼叫主題變數 的方法$_,因此程式碼的第一個「單字」.put本質上是 的簡寫$_.put

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

註 4:Raku/Perl6 有一組更受限制的命令列標誌。標誌-e(“執行”)在命令列中運行 Raku/Perl6 程式碼。此-n標誌逐行執行 Raku/Perl6 程式碼,即針對輸入檔案的每一行一次執行一行,並傳回結果。這兩個標誌可以組合成一個-ne標誌,但無論如何,該-e標誌必須放在最後。

Perl_6 連結:
https://docs.raku.org/language/5to6-nutshell#Command-line_flags
https://github.com/rakudo/rakudo/wiki/Running-rakudo-from-the-command-line

相關內容