Substituindo linhas contendo um padrão por sed

3

Como posso substituir um determinado caractere em uma linha que corresponde a um padrão com sed?

Por exemplo: eu gostaria de combinar todas as linhas que começam com uma letra e substituir a nova linha no final por uma guia. Estou tentando fazer isso usando: sed -e '/^[A-Z]/s/\n/\t/g' (as linhas em que estou interessado também terminam SEMPRE com uma letra, se isso puder ajudar).

Exemplo de entrada

NAME_A
12,1
NAME_B
21,2

Exemplo de saída

NAME_A    12,1
NAME_B    21,2
    
por dovah 29.07.2014 / 09:54

2 respostas

7
sed '/^[[:alpha:]]/{$!N;s/\n/       /;}' <<\DATA
NAME_A
12,1
NAME_B
21,2
DATA

OUTPUT

NAME_A  12,1
NAME_B  21,2

Isso endereça as linhas que começam com uma letra, puxa a próxima se houver uma e substitui um caractere de tabulação pela nova linha.

observe que o s/\n/<tab>/ bit contém um caractere de tabulação literal aqui, embora alguns sed s também possam suportar o \t escape em seu lugar

Para lidar com uma situação recursiva, você precisa torná-la um pouco mais robusta, assim:

sed '$!N;/^[[:alpha:]].*\n[^[:alpha:]]/s/\n/    /;P;D' <<\DATA
NAME_A
NAME_B
12,1  
NAME_C
21,2
DATA

OUTPUT

NAME_A
NAME_B  12,1
NAME_C  21,2

Que desliza por um conjunto de dados sempre com uma linha à frente. Se duas linhas ^[[:alpha:]] ocorrerem uma após a outra, ela não substituirá a nova linha, como você pode ver.

    
por 29.07.2014 / 10:04
2

Outra solução:

sed -e :a -e '$!N;s/\n\([^[:alpha:]]\)/ /;ta' -e 'P;D'

Isto acrescenta a linha atual à linha anterior se não começar com a palavra alfabética.

Atualizado

Uma solução do @mikerserv após nossa discussão:

sed ':a
/^[[:alpha:]]/{$!N;/\n[^[:alpha:]]/!ba;s/\(.*\)\n/\t/}
' file

Explicação

On a line that starts with an alphabetic character, it pulls in the next if there is one, then, if it can address a newline followed by a non-alphabetic character, it selects everything in pattern space up to the last newline there and does a substitute on it - changing the last new line to a tab. But if not it branches back and tries again.

    
por 29.07.2014 / 10:46

Tags