
我已經解析了一個文件,但存在一些問題,一個快速的解決方法是將空行替換為它下面的行,那麼我該怎麼做
就像下面的文件
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
or NF == 0
。
答案4
您可以按如下方式執行此操作:
$ sed -e ' /^$/{$!N' -e '}' -e 's/\n//p' inp