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

时间:2013-06-20 08:35:36

标签: bash

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

> cat file.txt | egrep -v P*

那不是输出到控制台。我可以在没有其他命令的情况下在文件上使用cat,它可以打印出来。我的最终目的是:

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

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

6 个答案:

答案 0 :(得分:12)

解释

  1. 使用^将您的模式锚定到该行的开头;
  2. 使用sedd flag
  3. 删除与模式匹配的行

    解决方案#1

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

    更好的解决方案

    仅使用sed

    sed '/^P/d' file.txt > new.txt
    

答案 1 :(得分:8)

使用awk:

awk '!/^P/' file.txt

解释

  1. 条件以!否定)开头,否定以下模式;
    • /^P/表示“匹配以大写P开头的所有行”
  2. 因此,该模式被否定为忽略以大写P 开头的行
  3. 最后,当awk操作块)丢失时,它会利用{ … }的行为,即打印验证条件的记录。
  4. 所以,重新说一下,忽略以大写P开头的行并打印其他所有内容

    注意

    sed面向行,面向awk列。对于你的情况,你应该使用第一个,见Edouard Lopez的回应。

答案 2 :(得分:2)

使用行号开头和引号:

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

P*表示P为0或更多次因此与-v一起为您提供无行

^P.*表示开始行,然后是P,任何char为0或更多次

需要引用以防止shell扩展。

这可以缩短为

egrep -v ^P file.txt

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

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

grep -v ^P file.txt

最后

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

答案 3 :(得分:2)

这有效:

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

-e表示表达。

答案 4 :(得分:1)

sed与原地替换一起使用(对于GNU sed,也将用于你的cygwin)

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

BSD(Mac)sed

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

答案 5 :(得分:0)

如果您想直接对已编辑的文件进行更改,请使用 sed -i '/^P/d' file.txt