如何用空白行下面的行替換它?

如何用空白行下面的行替換它?

我已經解析了一個文件,但存在一些問題,一個快速的解決方法是將空行替換為它下面的行,那麼我該怎麼做

就像下面的文件

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 == 0or NF == 0

答案4

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

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

相關內容