Bash - 删除所有以“P”开头的行

Bash - 删除所有以“P”开头的行

我有一个大约 300KB 大小的文本文件。我想从这个文件中删除所有以字母“P”开头的行。这就是我一直在使用的方法:

> cat file.txt | egrep -v P*

那不是输出到控制台。我可以在文件上使用 cat 而不需要其他命令,而且打印效果很好。我的最终目的是:

> cat file.txt | egrep -v P* > new.txt

没有出现错误,只是没有打印出任何内容,如果我运行第二个命令,new.txt 是空的。

编辑:我应该说我正在运行安装了 Cygwin 的 Windows 7。

答案1

尝试以下命令:

cat file.txt | egrep -v '^P*' > new.txt

避免猫的无用用途将会:

egrep -v '^P*' file.txt > new.txt

您需要在 egrep 中的正则表达式周围加上引号,否则 bash 会扩展它们(在您的情况下,glob*会扩展到当前目录中以大写字母 P 开头的每个文件)。

答案2

P*作为正则表达式,表示“任意数量的Ps,包括 0”。因此它将始终匹配,因为每行至少包含 0 个Ps。这解释了为什么egrep -v P*不打印任何内容:每行都匹配,并-v选择不匹配的行。(实际上,它可能会做其他事情,因为P*bash 会将其扩展为当前目录中以字母开头的文件列表P(如果有的话)。您应该使用引号egrep -v "P*",但这不是您的问题。)

您想要匹配P行首的 1。因此,您需要指定正则表达式是“锚定的”(仅匹配行首),方法是在行^首放置 :

grep -v ^P file.txt > new.txt

顺便说一句,egrep已被弃用;您应该使用grep -E,但在这种情况下,基本和扩展正则表达式之间没有区别。

grep不使用“globs”,而是使用正则表达式。并且它不强制正则表达式匹配整行;只要匹配正则表达式的字符串出现在行中的某处就足够了。

相关内容