![如何删除文本文件中少于“x”个字符的所有行?](https://linux22.com/image/170992/%E5%A6%82%E4%BD%95%E5%88%A0%E9%99%A4%E6%96%87%E6%9C%AC%E6%96%87%E4%BB%B6%E4%B8%AD%E5%B0%91%E4%BA%8E%E2%80%9Cx%E2%80%9D%E4%B8%AA%E5%AD%97%E7%AC%A6%E7%9A%84%E6%89%80%E6%9C%89%E8%A1%8C%EF%BC%9F.png)
如何删除文本文件中少于“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