我已经解析了一个文件,但存在一些问题,一个快速的解决方法是将空行替换为它下面的行,那么我该怎么做
就像下面的文件
apple
banana
big
sig
cake
应该转换为
apple
banana
banana
big
sig
cake
cake
答案1
和sed
:
sed -ne '/./!{n;p;}' -e p your-file
/./! action
为执行以下操作的行运行操作(此处检索n
ext 行并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 == 0
或NF == 0
。
答案4
您可以按如下方式执行此操作:
$ sed -e ' /^$/{$!N' -e '}' -e 's/\n//p' inp