Sed命令 - 无法删除以单词[...]开头的行

时间:2016-02-10 23:28:40

标签: bash unix vim sed

对于家庭作业,我正在尝试编写一个sed脚本,删除以Today开头的行

我使用vim创建.sed文件(q1.sed是它的名称),这是我在脚本中使用的命令:

$ sed -n '/^Today/ d' filename

我的导师说他将使用示例.txt文件来使用此命令,这就是他要求我们尝试从目录中运行脚本的方式:

$ sed -f q1.sed samplefile.txt

当它生成输出时,仍会显示包含“今天”的行。我做错了什么? (这是我从目录中的命令执行或未执行的操作,还是我从vim执行的命令?)

4 个答案:

答案 0 :(得分:3)

文件中,您只需要输入:

/^Today/d

然后:

sed -f q1.sed samplefile.txt

Etvoilà,它有效!

答案 1 :(得分:1)

我对-n选项并不是特别熟悉,但使用-e选项可以正常使用:

Glastonbury:~ dhoelzer$ cat test.txt
Today is a test
this is a test
this is Not a Today test.
Glastonbury:~ dhoelzer$ sed -e '/^Today/d' test.txt
this is a test
this is Not a Today test.

要使用sed文件执行此操作,只需将该表达式粘贴到文本文件中:

/^Today/d

sed -f sendfile test.txt

我无法确定,但看起来你在问题中有一些额外的空白,这可能是你问题的根源。

答案 2 :(得分:1)

除了将脚本放入文件的问题之外,还有命令行版本

sed -n '/^Today/ d' filename

根本不会打印任何内容,因为-n选项会阻止打印。如果你想使用-n,你必须颠倒逻辑:

sed -n '/^Today/p' filename

在“执行打印行以'今天'开头。

运行sed有三种主要方式:

  1. 从命令行(或从shell脚本中),如上所述

  2. 作为提供给sed的-f选项的脚本(这是教师想要的)。该文件仅包含sed命令,在本例中只包含一个:

    /^Today/d
    
  3. 作为独立的可执行文件:如果您的脚本看起来像

    #!/bin/sed -f
    
    /^Today/d
    

    您可以直接使用

    运行它
    ./sedscr.sed infile
    

    /bin/sed必须指向您的sed可执行文件。

  4. 你所做的是将命令 sed -n '/^Today/ d' filename提供给sed。如果你在命令行上这样做,sed会抱怨;如果你在提供给sed -f的脚本中执行此操作,则sed会忽略违规行。

答案 3 :(得分:1)

由于问题也标记为vim,因此这里是Vim本身的一个例子:

:g/^Today/d

详细了解g here