Preso em separar chars em strings na minha abordagem. Encontrou uma abordagem de trabalho, mas não consegue entendê-lo

1

Eu estou tentando descobrir como quebrar uma string para ficar no caractere por linha.
Por exemplo, ahebhaaa a ser:

a  
h  
e  
b  
h  
a  
a  
a  

Eu tentei:

$ echo ahebhaaa | sed 's/\(.\)\(.\)/\n/g'
Ou seja minha intenção era "plugin" entre chars uma nova linha usando grupos de captura, mas eu recebo:

a  
he  
bh  
aa  
a   

Eu acho que isso tem a ver com ganancioso / não-ganancioso, mas adicionando? * em qualquer lugar isso não faz nada. O que estou fazendo errado aqui?

Além disso, descobri que isso é:
echo ahebhaaa | sed 's/[^\n]/&\n/g'
Faz o trabalho. Mas eu não entendo como isso funciona. O que é & ? Como o [^\n] funciona?

    
por Jim 15.09.2013 / 11:19

3 respostas

4

grupos de captura

Seu primeiro exemplo foi próximo, mas você está dizendo sed que você quer levar 2 caracteres de cada vez com o \(.\)\(.\) bit, para fazer isso usando um grupo de captura você pode ajustá-lo assim:

$ echo ahebhaaa | sed 's/\(.\)/\n/g'
a
h
e
b
h
a
a
a

usando &

Por que o exemplo sed com o & funciona. O & em uma pesquisa e substituição é o mesmo que os caracteres que a expressão regular corresponde. Então, tudo que foi não a \n .

Exemplos

$ echo "123 abc" | sed 's/[0-9]*/&&/'
123123 abc

O primeiro & imprime os caracteres que foram correspondidos pelo padrão ( [0-9]* ), 123 . O segundo & imprime uma segunda vez.

$ echo "123 abc" | sed 's/ab/&&&/'
123 abababc

O padrão que procuramos é ab . À medida que percorremos a string 123 abc sed está imprimindo os caracteres não correspondentes, 123 . Em seguida, a string ab é encontrada, o que coincide com o que estamos procurando e substituindo. Então sed substitui com 3 cópias do que corresponde ( abbab ). Finalmente sed imprime o c .

A notação [^\n] cria um conjunto de não um caractere de fim de linha. Então, pense em sed enquanto ele percorre sua sequência de texto, ahebhaaa , está testando cada um desses caracteres e dizendo "Isso não é um \n "? Se não for um caractere de fim de linha, sed faz uma pesquisa e substitui esse caractere e o & imprime o que foi correspondido, ou seja, o caractere, junto com um novo caractere de linha. Em seguida, ele repete isso enquanto percorre a string ahebhaaa .

Referências

por 15.09.2013 / 12:02
2

Eu não entendo por que o \ n entra em ação nesse exemplo, já que é uma situação de espaço de padrão de linha única, portanto não há novas linhas. Portanto, isso deve ser suficiente:

sed 's/./&\n/g'
    
por 15.09.2013 / 12:16
2

Uma alternativa em Perl

echo "abcdefg"|perl -nle 'print for split//'
    
por 15.09.2013 / 17:15