Mesclando 3 linhas consecutivas com swap

4

Ei, preciso mesclar três linhas consecutivas com a troca entre a segunda e a terceira linha em 'file':

$cat file
Object Name: A
    comments: comment A
    manual_encdomain: Name: A 
Object Name: B
    comments: comment B
    manual_encdomain: Name: B 

Então, em vez da saída abaixo:

$sed 'N;N;s/\n/ /g' file 
Object Name: A comments: comment A manual_encdomain: Name: A 
Object Name: B comments: comment B manual_encdomain: Name: B

Eu prefiro precisar disso

Object Name: A manual_encdomain: Name: A comments: comment A
Object Name: B manual_encdomain: Name: B comments: comment B

sed, awk nada

    
por irom 14.09.2017 / 19:39

3 respostas

4

Sim, você pode usar sed para trocar linhas:

$ sed -E 'N;N;s/\n([^\n]*)\n([^\n]*)/  /' file
Object Name: A     manual_encdomain: Name: A      comments: comment A
Object Name: B     manual_encdomain: Name: B      comments: comment B

Ou, de forma equivalente:

$ sed  'N;N;s/\n\([^\n]*\)\n\([^\n]*\)/  /g' file
Object Name: A     manual_encdomain: Name: A      comments: comment A
Object Name: B     manual_encdomain: Name: B      comments: comment B

Como funciona:

  • -E

    Isso ativa expressões regulares estendidas. ( -E funciona tanto no BSD (OSX) sed quanto no moderno GNU sed. Para versões mais antigas do GNU sed, use -r ).

    Sem regex estendido, precisamos escapar de ( e ) conforme mostrado acima.

  • N;N

    Isto lê as segunda e terceira linhas.

  • s/\n([^\n]*)\n([^\n]*)/ /

    Isso troca a segunda e terceira linhas. A primeira ocorrência de \n([^\n]*) captura a segunda linha e a salva no grupo de captura 1. A segunda ocorrência de \n([^\n]*) captura a terceira linha e a salva no grupo de captura 2. O texto de substituição, troca a posição enquanto substitui as novas linhas com espaços.

Removendo algum excesso de espaço em branco

A segunda e terceira linhas são recuadas no arquivo de entrada. Se quisermos remover esse espaço em branco extra:

$ sed -E 'N;N;s/\n[[:blank:]]*([^\n]*)\n[[:blank:]]*([^\n]*)/  /g' file
Object Name: A manual_encdomain: Name: A  comments: comment A
Object Name: B manual_encdomain: Name: B  comments: comment B

[[:blank:]] é a maneira segura de unicode para corresponder espaços em branco e tabulações.

    
por 14.09.2017 / 19:52
5

com awk:

awk '{line1=$0; getline line2; getline line3; print line1, line3, line2}' file
    
por 14.09.2017 / 20:11
1

Com ex e printf :

printf '%s\n' 'g/^O/+m +2' 'g/^O/j 3' %p | ex file.txt

Altere o %p para um x para salvar as alterações quando estiver satisfeito com a saída.

g lobally, nas linhas que começam ( ^ ) com um O maiúsculo, mova ( m ) a próxima linha ( + ) para depois da segunda linha seguinte ( +2 ).

Então, globalmente, em cada linha começando com O, junte três linhas juntas.

Imprimir todas as linhas %p .

Ou salve e saia do x .

    
por 15.09.2017 / 03:51

Tags