我想删除一个空白行,只有当这个空格行在我的模式行之后才使用sed或awk 例如,如果我有
G
O TO P999-ERREUR
END-IF.
这种情况下的模式是G
我想要这个输出
G
O TO P999-ERREUR
END-IF.
答案 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
在文件的整个长度上保持两行的移动窗口,如果它符合预期的模式,则删除换行符(和任何空格)。