如何删除比 XY 短的线?

如何删除比 XY 短的线?

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

如果线长于 XY 如何删除?

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

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

答案1

你可以使用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

答案2

更多的变化:

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

答案3

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

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

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

使用 Vim 非常神奇的正则表达式模式 (\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 个字符。

答案4

要直接删除这些行,您可以:

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

或布雷:

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

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

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

在命令替换子 shell 中执行上述操作将确保grep在 cat 开始写入之前获取其上的读取描述符,但<<HEREDOC也将确保结果保持流式传输并且不会导致参数长度错误。

相关内容