
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
/./! action
executa a ação (aqui recupera a n
linha ext e p
a imprime) para as linhas que fazemnão( !
) contém qualquer caractere único ( .
é o operador regex que corresponde a qualquer caractere único).
Algumas sed
implementações também possuem uma opção -i
ou -i ''
para editar o arquivo no local.
Responder2
Você pode fazer isso awk
com 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 == 0
ou NF == 0
.
Responder4
Você pode fazer isso da seguinte maneira:
$ sed -e ' /^$/{$!N' -e '}' -e 's/\n//p' inp