Como faço para manter uma parte do padrão correspondente e usá-lo para substituir o BSD sed?

2

Eu encontrei uma alma para o GNU sed, e também encontrei algo como , mas o Terminal me diz que "não está definido no RE".

Mas o que eu quero fazer é isto:

Se eu tiver uma string parecida com essa sinder-city1.gif , eu quero fazer com que sinder-city.gif , agora eu não posso simplesmente substituir a string inteira, porque eu vou fazer isso com muitas strings diferentes, nem Eu apenas removo todos os números antes de .gif ou algum outro padrão porque se houver

sinder-city2.gif
sinder-city3.gif

Eu quero que eles permaneçam intactos.

Eu não quero substituir isso. Para combinar isso, eu digito sed 's,[a-z]1.gif, , mas se eu remover isso, ficarei com sinder-cit.gif . Como faço para coincidir com y ?

Eu quero fazer assim:

sed 's,[a-z]1.gif,[here is the last letter].gif,g'

Tem que funcionar no BSD sed.

    
por Rashman Raymond 09.12.2015 / 01:03

1 resposta

3
sed 's,\([a-z]\)1\.gif$,.gif,g'

ou, se você quiser permitir qualquer não dígito antes do 1

sed 's,\([^0-9]\)1\.gif$,.gif,g'

O constructo de backslash-parenthesis delimita um grupo de captura, que a página de manual do FreeBSD chama uma expressão de colchetes (apesar do uso de parênteses - os colchetes significam outra coisa). Observe que o sed usa expressões regulares básicas (BRE), não expressões regulares estendidas (ERE); a man page descreve ERE e o último parágrafo explica a diferença entre a sintaxe BRE e a sintaxe ERE. Eu acho a especificação POSIX mais legível que a página man do BSD aqui; ele chama grupos de captura expressões de referência anterior . O manual do GNU sed é mais legível do que qualquer outro; apenas evite os recursos descritos como extensões GNU.

Dado um grupo de captura (também conhecido como expressão de referência anterior), você pode usar barra invertida + dígito no texto de substituição para significar "o texto correspondido pelo grupo de captura correspondente". Por exemplo, no texto de substituição é substituído pelo texto correspondido pelo primeiro grupo de captura na expressão regular. Aqui há um único grupo de captura, que captura a letra antes de 1.gif .

Alterei 1.gif para 1\.gif para corresponder literalmente ao ponto e adicionei um $ à direita para corresponder apenas ao final da linha.

Para dar outro exemplo de grupos de captura, se você quiser operar extensões arbitrárias, pode usar algo como

sed 's,\([^0-9]\)1\(\.[^./]*\)$,,g'
    
por 09.12.2015 / 01:22