我发现了一个关于如何删除长度超过 2048 个字符的行的问题:
问:但是如何删除短于 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
也将确保结果保持流式传输并且不会导致参数长度错误。