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'