如何用空行下面的行替换它?

如何用空行下面的行替换它?

我已经解析了一个文件,但存在一些问题,一个快速的解决方法是将空行替换为它下面的行,那么我该怎么做

就像下面的文件

apple

banana
big
sig

cake

应该转换为

apple
banana
banana
big
sig
cake
cake

答案1

sed

sed -ne '/./!{n;p;}' -e p your-file

/./! action为执行以下操作的行运行操作(此处检索next 行并p打印它)不是( !) 包含任何单个字符(.是匹配任何单个字符的正则表达式运算符)。

某些sed实现还具有-i-i ''选项来就地编辑文件。

答案2

您可以使用awk它的getline()功能来完成此操作。该命令通过选择文本文件中的空行来工作!NF,即,这意味着那些空行(行内的字段数为 0)。使用该getline()函数我们得到下一个空行中的立即行并存储在变量中nxt

awk '!NF && ((getline nxt) >0){ $0 = nxt ORS nxt }1' file

然后,其中的部分{..}构造了一行,将变量、嵌入的换行符(与 的字符串连接ORS)和变量再次组合起来。需要第二次追加,因为getline()默认情况下调用会将行指针前进一级。看如何使用 awk 永久更改文件? (“就地”编辑,与“sed -i”一样)动态更改文件。

答案3

$ awk '/^$/ { ++r; next } { print; for (i=0; i<r; ++i) print; r=0 }' file
apple
banana
banana
big
sig
cake
cake

或者

awk '/^$/ { ++r; next } { print; while (r > 0) { print; --r } }' file

给出相同的输出。

这将每行打印 1 次,加上与其上方的空白行数相对应的次数。空行计入变量中r

使用正则表达式检测空行^$,但您也可以使用length == 0NF == 0

答案4

您可以按如下方式执行此操作:

$ sed -e ' /^$/{$!N' -e '}' -e 's/\n//p' inp

相关内容