Por que esse comando sed não captura o padrão?

2

Eu quero colocar um par de parênteses em torno de uma string usando um sed oneliner.

Isso é o que eu tentei

echo 1 | sed -e 's/.*/(
(0)
)/'

Espero que a letra 1 seja correspondida pelo padrão .* .

No entanto, a saída é apenas

(1)

Eu realmente quero obter este resultado:

echo 1 | sed -e 's/.*/(
(0)
)/'

Estou usando o BSD sed no OSX

    
por Anthony Kong 14.06.2018 / 02:54

3 respostas

5

& é o modo padrão de substituir toda a correspondência de padrões. Algumas sed implementações como GNU's ou busybox 'suportam %code% como uma alternativa, mas isso não é padrão nem portátil.

$ echo 1 | sed -e 's/.*/(&)/'
(1)

Esse comando inclui a primeira sequência (possivelmente vazia) de caracteres , o maior número possível em cada linha entre parênteses. Isso não pode incluir a linha completa para as linhas que contêm bytes que não formam caracteres válidos. Nesse caso, você pode descobrir que:

sed 's/^/(/; s/$/)/'

Funciona de forma mais confiável para colocar a linha completa dentro dos parênteses.

    
por 14.06.2018 / 03:04
1

referenciaria o primeiro grupo de captura. Como você atualmente não tem nenhum grupo de captura, você pode definir a correspondência como grupo de captura cercando-a com chaves e fazendo referência a ela usando :

$ echo 1 | sed 's/\(.*\)/()/'
(1)
    
por 14.06.2018 / 12:51
0

Eu fiz abaixo do comando awk

echo 1 | awk '{print "("$0")"}'

saída

(1)
    
por 19.06.2018 / 12:05

Tags