结论:
- 输入文件有"\n"(不是"\r\n")行结尾.
- 非空行至少包含两个字符.
- 我们不必关心开头或结尾的空行
文件的内容.
支持-z
(Slurp)选项和\n
表示法的IF GNU sed
为
可用.请你试一试:
sed -Ez "s/([^\n]\n)\n([^\n])/\1\2/g" input.txt > no-spaces.txt
input.txt
人的例子:
line1
line2 # following blank line should be removed
line3 # following blank lines should be kept
line4
输出:
line1
line2 # following blank line should be removed
line3 # following blank lines should be kept
line4
Sed
通常逐行处理输入.这就是为什么我们不能处理
跨多行的输入.-z
选项通过以下方式更改行为
将输入行分隔符设置为NUL字符.
([^\n]\n)
匹配非空行的最后一个字符.将\1
设置为备份
KReference.
\n
是中间的空行(要删除).
([^\n])
匹配后面非空行的第一个字符.\2
是
设置为反向引用.
顺便提一下,在bash
的帮助下,以下内容将适用于任何符合POSIX标准的SED:
#!/bin/bash
# define newline character for replacement
NL=$'\\\n'
sed -E '
:l
N
$!b l
# first slurp all lines in the pattern space
# and perform the replacements over the lines
s/([^'"$NL"']'"$NL"')'"$NL"'([^'"$NL"'])/\1\2/g
' input.txt > no-spaces.txt