Como combinar um padrão e substituir apenas parte do padrão?

3

Eu tenho a única linha longa abaixo em um arquivo:

#cat file
5LkoVZg0BABCBkD9OieAflA==|list1|true|0|0|0|172661|1.16|186042, 5o0QEZg0BABCA3j9OieAflA==|list2|false|0|0|0|0|0|0, 5F3NnwwoBABC1Dfrsf9xucw==|list3|false|0|0|0|0|0|0, 5FaJmwwoBABC0-frsf9xucw==|...

Eu gostaria de substituir o caractere de vírgula por uma nova linha, então a saída é assim:

 5LkoVZg0BABCBkD9OieAflA==|list1|true|0|0|0|172661|1.16|186042
 5o0QEZg0BABCA3j9OieAflA==|list2|false|0|0|0|0|0|
 5F3NnwwoBABC1Dfrsf9xucw==|list3|false|0|0|0|0|0|0
 5FaJmwwoBABC0-frsf9xucw==|...

Mais especificamente, a vírgula posicionada antes do caractere "5", observe que há um espaço sempre antes do caractere "5".

Eu posso substituir a vírgula simplesmente usando:

#cat file | sed -e $'s/,/\\n/g'

No entanto, isso não é bom o suficiente porque a vírgula pode ser localizada às vezes também em outras posições inadequadas, como abaixo:

#cat file
5LkoVZg0BABCBkD9OieAflA==|list1 , |true|0|0|0|172661|1.16|186042, 5o0QEZg0BABCA3j9OieAflA==...

Eu prefiro usar sed, mas outras soluções também são ótimas. Eu pesquisei na internet quatro horas, mas não consegui encontrar uma solução para o meu problema exato.

    
por Kalfa 11.05.2017 / 11:26

2 respostas

4

sed abordagem:

cat file
5LkoVZg0BABCBkD9OieAflA==|list1 , |true|0|0|0|172661|1.16|186042, 5o0QEZg0BABCA3j9OieAflA==|list2|false|0|0|0|0|0|0, 5F3NnwwoBABC1Dfrsf9xucw==|list3|false|0|0|0|0|0|0, 5FaJmwwoBABC0-frsf9xucw==|...
sed 's/, \(\S*==\)/\n/g' file

A saída:

5LkoVZg0BABCBkD9OieAflA==|list1 , |true|0|0|0|172661|1.16|186042
5o0QEZg0BABCA3j9OieAflA==|list2|false|0|0|0|0|0|0
5F3NnwwoBABC1Dfrsf9xucw==|list3|false|0|0|0|0|0|0
5FaJmwwoBABC0-frsf9xucw==|...

\S*== - sequência de caracteres que não são espaços em branco seguida por == , tratada como sequência principal de cada linha

    
por 11.05.2017 / 11:27
0

Uma solução mais simples usando tr da seguinte forma:

cat file | tr "," "\n"

Em que tr procurará a vírgula , e substituirá pela nova linha \n

Saída:

5LkoVZg0BABCBkD9OieAflA==|list1|true|0|0|0|172661|1.16|186042
 5o0QEZg0BABCA3j9OieAflA==|list2|false|0|0|0|0|0|0
 5F3NnwwoBABC1Dfrsf9xucw==|list3|false|0|0|0|0|0|0
 5FaJmwwoBABC0-frsf9xucw==|...

Observando que os espaços antes da vírgula foram mantidos.

    
por 11.05.2017 / 14:19