sed: adicionando espaço ao redor do cólon

0

Eu estava tentando escrever um comando sed onde, se ele encontrar dois-pontos sem espaços adjacentes, ele colocará um espaço antes e depois dos dois-pontos, ou seja, abc:def será convertido em abc : def . Eu estou fazendo assim:

echo "abc:def" | sed -e 's/[^\s]\+:[^\s]\+/ : /g'

a saída ainda é abc:def , como faço isso? o que está errado com o meu comando acima?

    
por ramgorur 13.06.2017 / 02:54

2 respostas

1

\s significa que o espaço em sed não é portátil - por exemplo, em implementações POSIX, sua expressão não corresponderá, por exemplo, (GNU sed, no modo posix):

$ echo "abc:def" | sed --posix -e 's/[^\s]\+:[^\s]\+/ : /g'
abc:def

No entanto, se sua expressão tiver correspondência, ela não fará o que você deseja, pois substituirá toda a sequência, por exemplo, (GNU sed, no modo não posix):

$ echo "abc:def" | sed -e 's/[^\s]\+:[^\s]\+/ : /g'
 : 

Provavelmente, o que você deseja é algo mais como s/\([^[:blank:]]\):\([^[:blank:]]\)/ : / , por exemplo,

$ echo "abc:def" | sed -e 's/\([^[:blank:]]\):\([^[:blank:]]\)/ : /g'
abc : def

[Até onde eu posso ver, o operador de repetição \+ - que também não é portátil - é desnecessário.]

    
por 13.06.2017 / 03:18
0

Tente:

echo "abc:def" | sed 's@\([^\s]\):\([^\s]\)@ : @g'

Eu testei isso com o GNU sed, não tenho certeza sobre o BSD sed.

Você precisa de grupos de captura para preservar partes da correspondência original, que é o que os \(...\) e e estão fazendo. Além disso, você não precisa do qualificador + , já que todos os seus interesses são os vizinhos imediatos.

    
por 13.06.2017 / 03:16