只有在使用sed或awk为空时才删除模式后面的一行

时间:2015-08-12 10:02:08

标签: linux bash awk sed

我想删除一个空白行,只有当这个空格行在我的模式行之后才使用sed或awk 例如,如果我有

G

O TO P999-ERREUR

END-IF.

这种情况下的模式是G 我想要这个输出

 G
 O TO P999-ERREUR

 END-IF.

4 个答案:

答案 0 :(得分:7)

这样可以解决问题:

$ awk -v n=-2 'NR==n+1 && !NF{next} /G/ {n=NR}1' file
G
O TO P999-ERREUR

END-IF.

说明:

-v n=-2    # Set n=-2 before the script is run to avoid not printing the first line
NR == n+1  # If the current line number is equal to the matching line + 1
&& !NF     # And the line is empty 
{next}     # Skip the line (don't print it)
/G/        # The regular expression to match
{n = NR}   # Save the current line number in the variable n
1          # Truthy value used a shorthand to print every (non skipped) line

答案 1 :(得分:2)

使用sed

sed '/GG/{N;s/\n$//}' file

如果它看到GG,则获取下一行,如果下一行为空,则删除它们之间的换行符。

请注意,此后只删除一个空行,并且该行必须为空,即不能为空格或制表符。

答案 2 :(得分:1)

使用ex(就地编辑):

ex +'/G/j' -cwq foo.txt 

或打印到标准输出(来自文件或标准输入):

ex -s +'/GG/j|%p|q!' file_or_/dev/stdin

其中:

  • /GG/j - 在找到模式时加入下一行
  • %p - 打印缓冲区
  • q! - 退出

对于条件检查(如果有空行),请尝试:

ex -s +'%s/^\(G\)\n/\1/' +'%p|q!' file_or_/dev/stdin

答案 3 :(得分:1)

这可能适合你(GNU sed):

sed -r 'N;s/(G.*)\n\s*$/\1/;P;D' file

在文件的整个长度上保持两行的移动窗口,如果它符合预期的模式,则删除换行符(和任何空格)。