sed:从第2行开始删除所有不包含字符串A或B的行

时间:2017-04-19 10:44:23

标签: bash awk sed

请帮忙 - 我被困了。

我需要

  1. 删除文本文件的所有行
  2. 不包含foo或Foo
  3. 从文件的第二行开始
  4. infile中

    first line 
    foobar 
    tree 
    fish
    Foo Bar
    Football
    Foobar
    Street
    foo bar
    

    OUTFILE

    first line
    foobar
    Foo Bar
    Football
    Foobar
    foo bar
    

    我尝试了以下内容:

    sed '2,$/*.foo.*\|.*Foo.*/!d' -i test.txt

    产生的错误是:

      

    sed:-e表达式#1,字符4:未知命令:`/'

    我的错误是什么? (awk也是一种可能的选择。)

8 个答案:

答案 0 :(得分:4)

sed 方法:

sed -e '2,${/[fF]oo/!d}' file
  

-e 脚本 - expression = script

     

script 中的命令添加到要运行的命令集中   处理输入。

2,$ - 一个地址范围,考虑从第二行到结尾的行

[fF] - 字符类,匹配fF

/!d - 删除不包含fooFoo

的行

答案 1 :(得分:3)

awk 'NR==1 || !/foo|Foo/' oldfile > newfile

注意:如果您使用csh或tcsh,则需要使用反斜杠保护!

awk 'NR==1 || \!/foo|Foo/' oldfile > newfile

答案 2 :(得分:2)

在awk中。首先是一些测试数据:

$ cat file
1 begin
2 asd
3 foo
4 sdf
5 Foo
6 end

代码。 print后的第一条记录包含fooFoo

$ awk 'NR==1 || /[fF]oo/' file
1 begin
3 foo
5 Foo

答案 3 :(得分:2)

一个好的选择是颠倒你的要求 - 删除所有行,但打印第一行和所有行使用foo或Foo。

sed -n '1p; /foo\|Foo/p'

如果第一行包含foo或Foo,则会打印第一行两次,但如果需要,可以很容易地修复它。

答案 4 :(得分:2)

森林里的另一个笨蛋

awk '!a++||!/[fF]oo/' infile

答案 5 :(得分:1)

偶然但没有sed awk(不知道它们是否是强制性的),您可以将文本文件的第一行复制到新文件中:

head -1 textfile > newfile

然后你可以将foo或Foo的所有内容附加到新文件中:

grep "foo\|Foo" textfile >> newfile

所以你将在newfile中拥有所需的内容。

如果您想将它放在原始文件中,则可以移动它:

mv newfile textfile

如果第一行包含foo或Foo,它将被打印两次,但正如你所说,你想保留第一行,我认为它既没有foo也没有Foo。

答案 6 :(得分:1)

这是你的代码:

sed '2,$/*.foo.*\|.*Foo.*/!d'

这里的问题是您使用两种形式的行寻址,即数字(addr1,addr2)和匹配(/REGEX/)。此外,正则表达式中存在错误。

以下是我将如何解决它:

sed '1b; /[fF]oo/!d' infile

输出:

first line
foobar 
Foo Bar
Football
Foobar
foo bar

答案 7 :(得分:0)

awk '/^[fF]/&&!/fish/' file

first line
foobar
Foo Bar
Football
Foobar
foo bar