如何删除文本文件中少于“x”个字符的所有行?

Aed*_*mas 8 sed awk text-processing

如何删除文本文件中少于“x”个字母或数字或符号的所有行?我不能使用, awk 'length($0)>'因为它会包含空格。

Kus*_*nda 13

假设您要删除包含少于n图形符号的行:

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

这将删除所有不匹配的字符[[:graph:]]。如果剩余字符串的长度大于或等于n,则打印(未修改的)行。

的值n在命令行中给出。

[[:graph:]]等价于[[:alnum:][:punct:]],而 又与 相同[[:alpha:][:digit:][:punct:]]。它[[:print:]]与空格大致相同但不匹配。

而不是[^[:graph:]],您可能会使用[[:blank:]]删除所有制表符或空格。

随着sedawk几乎字面上遵循上述代码,

sed -e 'h; s/[^[:graph:]]//g' \
    -e '/.\{5\}/!d; g'
Run Code Online (Sandbox Code Playgroud)

或者,简化(只计算非空白字符),

sed -e 'h; s/[[:blank:]]//g' \
    -e '/...../!d; g'
Run Code Online (Sandbox Code Playgroud)

这首先使用 将当前行保存到保持空间中h。然后删除带有s///g. 如果该行包含少于 5 个字符(将其更改为您想要的任何数字,或更改第二个变体中的点数),则该行将被删除。否则,存储的行是从保持空间中获取的,g并(隐式)打印。


Sté*_*las 7

sed -e 's/[^[:space:][:cntrl:]]/&/20' -e t -e d < file
Run Code Online (Sandbox Code Playgroud)

将打印file包含至少 20 个非空白非控制字符的行(另请参阅[[:graph:]][[:alnum:][:punct:]],不清楚您想从描述中包含/排除哪些字符;请注意,在某些系统上,非换行符包含在 中graph而不包含在space) 中。

这个想法是它尝试用它自己 ( &)替换第 20 次出现的非空白/控制字符,如果替换成功 ( t),我们就会分支,从而跳过d操作(删除)。

使用awk,您可以执行以下操作:

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

依赖于gsub()返回它所做的替换数量的事实。

grep

grep -E '^([[:space:][:cntrl:]]*[^[:space:][:cntrl:]]){20}' <  file
Run Code Online (Sandbox Code Playgroud)

(.*[^[:space:][:cntrl:]]){20}也可以工作,但会更贵)。