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

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

如何删除文本文件中少于“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///Ss

注 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

相关内容