【发布时间】:2018-04-24 06:09:55
【问题描述】:
假设我们有包含单词和多个空行的字符串。比如
"1\n2\n\n3\n\n\n4\n\n\n\n2\n\n3\n\n\n1\n"
我想使用 bash,sed 或 awk 将三个或更多空行“收缩”成两行以获取字符串
"1\n2\n\n3\n\n4\n\n2\n\n3\n\n1\n"
有人有想法吗?
【问题讨论】:
假设我们有包含单词和多个空行的字符串。比如
"1\n2\n\n3\n\n\n4\n\n\n\n2\n\n3\n\n\n1\n"
我想使用 bash,sed 或 awk 将三个或更多空行“收缩”成两行以获取字符串
"1\n2\n\n3\n\n4\n\n2\n\n3\n\n1\n"
有人有想法吗?
【问题讨论】:
awk
$ awk -v RS= -v ORS='\n\n' 1 file
【讨论】:
如果 perl 是可以接受的,
perl -00 -lpe1
应该这样做。它读取并输出整个段落,其副作用是将 2+ 换行符规范化为 \n\n。
【讨论】:
如果数据不是太多并且您有GNU sed,请使用sed -z 使其适用于单个以null 终止的记录,而不是每行一个\n-终止的记录:
sed -z 's/\n\n\n\n*/\n\n/g'
或者使用扩展的正则表达式:
sed -zr 's/\n{3,}/\n\n/g'
【讨论】:
sed -z 's/\(\n\)\{3\}\n*/\n\n/g' 怎么样?
s/\n\{3\}\n*/\n\n/g 应该是等效的。 's/\n{3,}/\n\n/g' 是 IMO 更漂亮,但它需要 -r 或 -E 标志。