Substituir apenas em uma cadeia de intervalos específica

3

No canônico Como posso substituir uma string em um arquivo (s)? em 3. Substitua somente se a string for encontrada em um determinado contexto , estou tentando implementar a substituição de um pipe com espaços em branco em um arquivo com estrutura como esta:

12/12/2000|23:16:03|Shell Sc|8332|START|TEXT|WITH|SPACES|-|[END]|[Something else]

Eu preciso disso assim:

12/12/2000|23:16:03|Shell Sc|8332|START TEXT WITH SPACES -|[END]|[Something else]

O código:

echo "12/12/2000|23:16:03|Shell Sc|8332|START|TEXT|WITH|SPACES|-|[END]|[Something else]" | \
 sed 's/\(START.*\)\|/ /g'

Alguma ideia?

    
por Bor 02.04.2016 / 19:37

2 respostas

5

O problema com seu comando é que, mesmo com o sinalizador g definido, uma parte específica do texto a ser correspondido só pode ser incluída em uma correspondência única . Como .* é ganancioso, você só acabará removendo o caractere final do pipe. Sem mencionar que o seu espaço no texto de substituição está no lugar errado.

Você poderia fazer isso com um comando s repetido em um loop, sendo executado até que não corresponda a nada. Assim:

sed -e ':looplabel' -e 's/\(START.*\)|\(.*|\[END\)/ /;t looplabel'

Ou usando um rótulo de loop mais curto:

sed -e ':t' -e 's/\(START.*\)|\(.*|\[END\)/ /;tt'
    
por 02.04.2016 / 20:55
2

Nesse caso específico, todos os | que você deseja substituir por espaços vêm imediatamente após uma letra maiúscula e imediatamente antes de uma letra maiúscula ou um - . Você pode, portanto, usar lookarounds :

$ perl -ple 's/(?<=[A-Z])\|(?=[A-Z-])/ /g' file
12/12/2000|23:16:03|Shell Sc|8332|START TEXT WITH SPACES -|[END]|[Something else]
    
por 02.04.2016 / 21:41

Tags