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}
也可以工作,但会更贵)。