我有一个大约 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*
作为正则表达式,表示“任意数量的P
s,包括 0”。因此它将始终匹配,因为每行至少包含 0 个P
s。这解释了为什么egrep -v P*
不打印任何内容:每行都匹配,并-v
选择不匹配的行。(实际上,它可能会做其他事情,因为P*
bash 会将其扩展为当前目录中以字母开头的文件列表P
(如果有的话)。您应该使用引号egrep -v "P*"
,但这不是您的问题。)
您想要匹配P
行首的 1。因此,您需要指定正则表达式是“锚定的”(仅匹配行首),方法是在行^
首放置 :
grep -v ^P file.txt > new.txt
顺便说一句,egrep
已被弃用;您应该使用grep -E
,但在这种情况下,基本和扩展正则表达式之间没有区别。
grep
不使用“globs”,而是使用正则表达式。并且它不强制正则表达式匹配整行;只要匹配正则表达式的字符串出现在行中的某处就足够了。