
Я проанализировал файл, но возникла некоторая проблема, и быстрый способ ее обойти — заменить пустую строку строкой под ней. Как это сделать?
как в следующем файле
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