9

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

> cat file.txt | egrep -v P*

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

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

没有出现错误,它只是不打印任何东西,如果我运行第二个命令,new.txt 是空的。我应该说我正在运行安装了 Cygwin 的 Windows 7。

4

5 回答 5

15

解释

  1. 用于^将您的模式锚定到行首;
  2. sed使用和dflag删除与模式匹配的行。

解决方案#1

cat file.txt | sed '/^P/d'

更好的解决方案

仅使用sed

sed '/^P/d' file.txt > new.txt
于 2013-06-20T08:36:45.647 回答
10

使用 awk:

awk '!/^P/' file.txt

解释

  1. 条件以!( negation ) 开头,否定以下模式;
    • /^P/表示“匹配所有以大写字母开头的行P
  2. 因此,该模式被否定为忽略以大写字母开头的行P
  3. 最后,它在( action blockawk ) 缺失时利用 的行为,即打印验证条件的记录。{ … }

因此,换个说法,它忽略以大写字母开头的行P并打印所有其他内容

笔记

sed是面向行和面向awk列的。对于您的情况,您应该使用第一个,请参阅 Edouard Lopez 的回复。

于 2013-06-20T10:09:22.733 回答
2

与就地替换一起使用sed(对于 GNU sed,也适用于您的 cygwin)

sed -i '/^P/d' file.txt

BSD (Mac) sed

sed -i '' '/^P/d' file.txt
于 2013-06-20T09:05:20.823 回答
2

使用行标记和引号的开始:

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

P*表示 P 零次或多次,因此与-v不给你任何线条

^P.*表示行首,然后是 P,以及任何字符零次或多次

需要引用以防止外壳扩展。

这可以缩短为

egrep -v ^P file.txt

因为.*不需要,因此不需要引用并且egrep可以从文件中读取数据。

由于我们不使用扩展正则表达式grep也可以正常工作

grep -v ^P file.txt

最后

grep -v ^P file.txt > new.txt
于 2013-06-20T08:36:47.107 回答
1

这有效:

cat file.txt | egrep -v -e '^P'

-e表示表达。

于 2013-06-20T08:42:38.867 回答