Sed remoção condicional de EOL [duplicado]

0

Para o exemplo a seguir, onde temos "\" no final, o caractere \ e EOL deve ser removido.

line 1\
line 2
line 3
line 4\
line 5

O resultado deve ser

line 1 line 2
line 3
line 4 line 5

Usando o vi, posso obter itens acima como: :%s/\//n//g

Mas quando eu faço isso no terminal não está funcionando. Alguma sugestão?

    
por Roopak Vasa 02.08.2018 / 12:05

1 resposta

2

Hmm ... essa substituição do Vi não funciona em nenhum editor Vi em que tentei. Você provavelmente quis dizer :%s/\\n/ /g , o que funcionaria no Vim, mas não no Vi.

$ sed '/\$/{N;s/\\n/ /;}' file
line 1 line 2
line 3
line 4 line 5

Isso detecta se a linha atual termina com uma barra invertida e, se houver, acrescenta a próxima linha ( sed adicionará um caractere de nova linha entre eles), substitui a barra invertida e a nova linha por um caractere de espaço.

Isso falhará se duas linhas consecutivas tiverem barras invertidas no final. Para isso, use algo como

sed ':top;/\$/{N;s/\\n/ /;btop;}' file

Aqui, se uma linha com barra invertida tiver sido processada, o código voltará ao início.

Versão anotada do último script sed :

:top;             # define label "top"
/\$/{            # the line ends with backslash
    N;            # append next line to pattern space with embedded newline
    s/\\n/ /;    # substitute backslash and newline with space
    btop;         # branch to "top"
}
                  # (implicit print)
    
por 02.08.2018 / 12:22