如何刪除文字檔案中少於“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///
S
s
註 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