Como substituir uma linha vazia pela linha abaixo dela?

Como substituir uma linha vazia pela linha abaixo dela?

Analisei um arquivo, mas há algum problema e uma maneira rápida de contornar isso é substituir a linha vazia pela linha abaixo dele, então como faço isso

como o seguinte arquivo

apple

banana
big
sig

cake

deveria converter para

apple
banana
banana
big
sig
cake
cake

Responder1

Com sed:

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

/./! actionexecuta a ação (aqui recupera a nlinha ext e pa imprime) para as linhas que fazemnão( !) contém qualquer caractere único ( .é o operador regex que corresponde a qualquer caractere único).

Algumas sedimplementações também possuem uma opção -iou -i ''para editar o arquivo no local.

Responder2

Você pode fazer isso awkcom sua getline()função. O comando funciona selecionando as linhas vazias no arquivo de texto !NF, ou seja, as linhas que estão vazias (o número de campos dentro da linha é 0). Usando a getline()função obtemos opróximolinha imediata da linha vazia e armazene na variável nxt.

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

Em seguida, a parte interna {..}constrói uma linha combinando a variável, uma nova linha incorporada (concatenação de string com ORS) e a variável novamente. O segundo acréscimo é necessário, porque getline()a chamada por padrão avança o ponteiro da linha em um nível. VerComo alterar permanentemente um arquivo usando o awk? (edições “no local”, como com “sed -i”)para alterar o arquivo dinamicamente.

Responder3

$ awk '/^$/ { ++r; next } { print; for (i=0; i<r; ++i) print; r=0 }' file
apple
banana
banana
big
sig
cake
cake

ou

awk '/^$/ { ++r; next } { print; while (r > 0) { print; --r } }' file

que dá a mesma saída.

Isso imprime cada linha 1 vez, mais o número de vezes correspondente ao número de linhas em branco acima dela. As linhas em branco são contadas na variável r.

Linhas em branco são detectadas com a expressão regular ^$, mas você também pode usar length == 0ou NF == 0.

Responder4

Você pode fazer isso da seguinte maneira:

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

informação relacionada