Как заменить пустую строку строкой, находящейся под ней?

Как заменить пустую строку строкой, находящейся под ней?

Я проанализировал файл, но возникла некоторая проблема, и быстрый способ ее обойти — заменить пустую строку строкой под ней. Как это сделать?

как в следующем файле

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

Связанный контент