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

Символы - означают, что файл записывается в лог-файл нормально, то есть буферизованно. Без - файл промывается через каждую строку, поэтому в случае проблем с питанием каждая строка уже была записана на диск.

0
28.05.2019, 00:39
5 ответов

Это можно сделать в awkс помощью функции getline(). Команда работает путем выбора пустых строк в текстовом файле !NF, т.е. это означает, что те строки, которые являются пустыми (, количество полей в строке равно 0 ). С помощью функции getline()мы получаем следующую непосредственную строку из пустой строки и сохраняем в переменной nxt.

awk '!NF && ((getline nxt) >0){ $0 = nxt ORS nxt }1' file

Затем часть внутри {..}создает строку, объединяющую переменную, встроенную новую -строку, (конкатенацию строки сORS)и переменную обратно. Второе добавление необходимо, потому что вызов getline()по умолчанию перемещает указатель строки на один уровень вперед. См. Как навсегда изменить файл с помощью awk? («в -месте» редактирования, как с «sed -i»)для динамического изменения файла.

3
28.01.2020, 02:13
$ 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.

1
28.01.2020, 02:13

Сsed:

sed -ne '/./!{n;p;}' -e p your-file

/./! actionзапускает действие (здесь извлекает nстроку ext и pпечатает ее )для строк, которые не(!)содержат какой-либо одиночный символ(.— это оператор регулярного выражения, который соответствует любому одиночному символу ).

Некоторые реализации sedтакже имеют опцию -iили -i ''для редактирования файла в месте -.

4
28.01.2020, 02:13

Пробовал с приведенной ниже комбинацией команд sed, все работало нормально

for i in `sed -n '/^$/{n;p}' filename`; do sed -i "0,/^$/s/^$/$i/g" filename; done

выход

apple
banana
banana
big
sig
cake
cake
1
28.01.2020, 02:13

Вы можете сделать это следующим образом:

$ sed -e ' /^$/{$!N' -e '}' -e 's/\n//p' inp
0
28.01.2020, 02:13

Теги

Похожие вопросы