如何删除短于XY的行?


29

我发现了一个有关如何删除行数超过2048个字符的问题:

如果长度超过XY,如何删除行?

问:但是如何删除少于4个字符的行?因此,删除文件中长度为1或2或3的行。

更新:感谢您提供许多好的答案,但我只能将其中一个标记为“好”

Answers:


42

您可以使用sed。以下内容将删除长度不超过3个字符的行:

sed -r '/^.{,3}$/d' filename

为了将更改保存到位,请提供-i选项。

如果您的版本sed不支持扩展的RE语法,则可以在BRE中编写相同的代码:

sed '/^.\{,3\}$/d' filename

适用于所有sed变体。


您还可以使用awk

awk 'length($0)>3' filename

使用perl

perl -lne 'length()>3 && print' filename

sed '/^.\{,3\}$/d'不适用于BSD sed :sed: 1: "/^.\{,3\}$/d": RE error: invalid repetition count(s)。sed -r版本在语法上有效,但不会删除行。
Dereckson

5

其他一些变化:

grep .... file

要么

sed '/..../!d' file

要么

sed -n 's/./&/4p' file

要么

awk 'gsub(/./,"&")>3' file

要么

awk 'length>3' file

或GNU awk:

awk 'NF>3' FS= file

1
哦,那个grep ....是如此优雅!
grofte

3

这是使用Vim的Ex模式和global命令的Vim解决方案。

这与using非常相似sed,只是需要转义一些特殊的字符('{','}')。

:g/^.\{,3\}$/d

使用Vim的Very Magic Regex模式(\ v),可以避免这种转义。

:g/\v^.{,3}$/d

另请参阅:帮助魔术

Use of "\v" means that in the pattern after it all ASCII characters except
'0'-'9', 'a'-'z', 'A'-'Z' and '_' have a special meaning.  "very magic"

有时也有用的相反vglobal

:v/\v^.{,3}$/d

会删除行以外的所有内容,直到3个字符。


1

直接删除行,您可以:

sed -ri '/.{4}/!d' /path/to/file

或BRE:

sed -i '/.\{4\}/!d' /path/to/file

如果一行不包含4个或更多字符,则将其删除。

f=/path/to/file
cat <<GREP >"$f"
    $(grep -E ".{4}" "$f")
GREP

在command-substitution子外壳程序中执行上述操作将确保grep在cat开始对其进行写操作之前在其上获得一个读取描述符,但<<HEREDOC还将确保结果保持流式传输并且不会引起参数长度错误。



0

您可以使用grep

如果您在行长中计算前导空格:

grep -e '[^\ ]\{4,\}' file

如果您不计算行长中的前导空格:

grep -e '[^\]\{4,\}' file
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.