使用 sed 删除文件中的行

使用 sed 删除文件中的行

我有一个如下所示的文件:

Heading - 
  - Completed foo
    - More information
    - Still more
  * Need to complete bar
  - Did baz (comment blah blah) ***

Another - 
  * Need to complete foo
  - Completed bar (blah comment blah) ***
  - Done baz

我需要运行文本文件sed以删除所有以空格(数字不同)和连字符以及另一个空格开头的行。

我需要使用什么正则表达式或模式sed才能使输出看起来像下面这样?

Heading - 
  * Need to complete bar

Another - 
  * Need to complete foo

答案1

我用了福西的回答,由丹尼斯·威廉森,帮助我想出sed /^\s+-\s.*/d哪个能按预期工作。

答案2

"s/\s*-\s.*//g"我认为应该这么做。

其中 \s 匹配空格,* 匹配零个或多个前导字符(空格),一个文字连字符,然后是另一个空格,然后 .+ 匹配其后的所有内容。

答案3

您应该使用 egrep 或 grep 来完成这项任务,sed 是一个流编辑器,grep 更符合一次一行的理念。

你需要一个匹配行首、空格、连字符、空格的正则表达式。听起来这行得通:

egrep  -v  '^[ ]+-[ ]' filename

-v选项使 egrep 删除匹配的行——这比构建拒绝行的正则表达式更容易。

例子:

 nobody$ egrep -v  '^[ ]+-[ ]' /tmp/foof
 Heading - 
   * Need to complete bar

 Another - 
   * Need to complete foo
 nobody$ cat /tmp/foof
 Heading - 
   - Completed foo
     - More information
     - Still more
   * Need to complete bar
   - Did baz (comment blah blah) ***

 Another - 
   * Need to complete foo
   - Completed bar (blah comment blah) ***
   - Done baz
 nobody$ _

处理制表符仅意味着您需要在括号表达式中使用它们,但这很难在线显示。

答案4

要从输出中过滤整行,通常需要grep,而不是sed。 特别是,要排除特定行,您需要使用grep -v 'exclusion-regex'

相关内容