比赛后删除空白行

时间:2019-11-26 17:57:36

标签: bash sed

想象一下下面的示例输入文件:

(1)    Lorem ipsum dolor sit amet
      vero eos et accusam et justo duo

(2)    Lorem ipsum dolor sit amet

   vero eos et accusam et justo duo

(3)    Lorem ipsum -- dolor sit amet
      vero eos et accusam et justo duo

(4)    Lorem -- ipsum dolor sit amet

   vero eos et accusam et justo duo

我有兴趣查找脚本中所有以关键字amet结尾并且不包含关键字--的行。如果找到这样的行,则如果后继行为空,则应将其删除。因此,仅第二(2)个示例必须更改:

(1)    Lorem ipsum dolor sit amet
      vero eos et accusam et justo duo

(2)    Lorem ipsum dolor sit amet
   vero eos et accusam et justo duo

(3)    Lorem ipsum -- dolor sit amet
      vero eos et accusam et justo duo

(4)    Lorem -- ipsum dolor sit amet

   vero eos et accusam et justo duo

2 个答案:

答案 0 :(得分:2)

此sed命令将起作用:

sed '/--/b;/amet$/{N;s/\n$//;}'

它执行以下操作:

/--/b        # If line matches "--", skip all commands
/amet$/ {    # If the line ends in "amet"
    N        # Read next line into pattern space
    s/\n$//  # Delete the second line if it is blank
}

在少数情况下会失败:以blamet结尾的行是否合格? --是否必须用空格分隔?可能会有这样的输入:

ends in amet
also ends in amet

next line

,因为提出的解决方案不会删除此处的空白行。不过,对于显示的输入,它将起作用。

答案 1 :(得分:2)

让我们一点一点地创建它:

  • 仅处理以amet结尾的行(使用GNU \b匹配单词边界):

    /\bamet$/
    
  • 如果其中不包含--

    /--/!
    
  • 然后打印该行

    n
    
  • 如果下一行为空,请将其删除

    /^$/d
    

这给出了一个简单的程序:

#!/bin/sed -f

# Process only lines that end with `amet`:
/\bamet$/{
# If it doesn't contain `--`
/--/!{
# Then print the line
n
# And if the next line is empty, delete it
/^$/d
}
}