【问题标题】:Sed command-- unable to remove lines beginning with word [...]Sed 命令 - 无法删除以单词开头的行 [...]
【发布时间】:2016-05-21 13:30:02
【问题描述】:

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

我使用 vim 制作了一个 .sed 文件(q1.sed 是它的名称),这是我在脚本中使用的命令:

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

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

$ sed -f q1.sed samplefile.txt

当它生成输出时,仍然会显示包含“Today”的行。我做错了什么? (是我从目录中的命令还是从 vim 提供的命令做了或没做的事情?)

【问题讨论】:

    标签: bash unix vim sed


    【解决方案1】:

    文件中,你只需要放:

    /^Today/d
    

    然后:

    sed -f q1.sed samplefile.txt
    

    等等,它的工作原理!

    【讨论】:

    【解决方案2】:

    我对@9​​87654321@ 选项不是特别熟悉,但是使用-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
    

    我不能确定,但​​看起来你的问题中有一些额外的空格,这可能是你问题的根源。

    【讨论】:

    • OP 要求使用 sed 文件
    【解决方案3】:

    除了将脚本放入文件的问题,你的命令行版本

    sed -n '/^Today/ d' filename
    

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

    sed -n '/^Today/p' filename
    

    如 "do 打印 以 'Today' 开头的行。

    运行 sed 主要有三种方式:

    1. 从命令行(或从 shell 脚本内部),如上

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

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

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

      你可以直接运行它

      ./sedscr.sed infile
      

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

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

    【讨论】:

      【解决方案4】:

      由于问题也被标记为vim,所以这里有一个在 Vim 本身中执行此操作的示例:

      :g/^Today/d
      

      阅读更多关于ghere的信息。

      【讨论】:

        猜你喜欢
        • 2019-07-26
        • 2019-04-08
        • 2015-06-04
        • 2018-05-05
        • 2020-04-09
        • 1970-01-01
        • 1970-01-01
        • 2020-09-23
        • 2021-12-11
        相关资源
        最近更新 更多