Como usar sed para substituir números por parenteses?

2

Eu tenho um arquivo test.txt contém muitas linhas como as seguintes:

hello:123: world
hello:783: world
hello:479: world
......

Como usar o comando sed para substituir as linhas da seguinte maneira?

hello:(123, 0): world
hello:(783, 0): world
hello:(479, 0): world
......

Obrigado antecipadamente!

    
por xmllmx 08.09.2016 / 13:35

3 respostas

4

Como você gosta deste? Espero que seja o que você precisava.

sed -e 's/\([0-9]\+\)/(, 0)/g'

Teste

echo "hello:123: world
hello:783: world
hello:479: world" | sed -e 's/\([0-9]\+\)/(, 0)/g'

Resultado

hello:(123, 0): world

hello:(783, 0): world

hello:(479, 0): world

    
por 08.09.2016 / 13:43
2

Supondo que a entrada tenha : texto separado e a segunda coluna precisa ser alterada:

$ awk 'BEGIN{ FS=OFS=":" } {$2 = "("$2", 0)"} 1' ip.txt
hello:(123, 0): world
hello:(783, 0): world
hello:(479, 0): world

Ou com perl

$ perl -F: -lane '$F[1] = "($F[1], 0)"; print join ":",@F' ip.txt
hello:(123, 0): world
hello:(783, 0): world
hello:(479, 0): world
    
por 08.09.2016 / 14:20
2

POSIXly:

sed 's/[0-9]\{1,\}/(&, 0)/' < file

Substituiria a primeira ocorrência de uma série de um ou mais ( \{1,\} ) dígitos decimais por (&, 0) (em que & é o texto que está sendo substituído) em cada linha.

Algumas implementações sed têm uma opção -E para usar expressões regulares estendidas (ERE) em vez das implementações básicas (BRE), quando você pode usar + no lugar de \{1,\} . -E pode chegar à próxima versão da especificação POSIX:

sed -E 's/[0-9]+/(&, 0)/' < file

Algumas implementações sed , como o GNU sed support \+ como alias BRE para \{1,\} , embora não sejam portáteis / padrão.

Para usar expressões regulares perl que estão se tornando um novo padrão de fato para expressões regulares, você pode usar ... perl :

perl -pe 's/\d+/($&, 0)/' < file
    
por 11.12.2017 / 10:59