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:]]删除所有制表符或空格。
随着sed,awk几乎字面上遵循上述代码,
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并(隐式)打印。
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}也可以工作,但会更贵)。