Como remover uma linha do repositório com sed

6

Meu /etc/apt/sources.list contém esta linha:

deb http://downloads.sourceforge.net/project/xenlism-wildfire/repo deb/ 

Eu quero remover essa linha via sed na linha de comando, então eu tentei esse código, mas retorna erro!

$ sudo sed 's:deb http://downloads.sourceforge.net/project/xenlism-wildfire/repo deb/::g' /etc/apt/sources.list
sed: -e expression #1, char 75: unknown option to 's'

Acho que o símbolo : após http causou esse erro, mas como posso corrigi-lo?

    
por Ali Razmdideh 25.12.2016 / 21:33

2 respostas

9

Você pode usar qualquer símbolo * para delimitar as strings de pesquisa / substituição que não conflitem com os símbolos nas strings, contanto que você as use de forma consistente, por exemplo:

sudo sed 's#deb http://downloads.sourceforge.net/project/xenlism-wildfire/repo deb/##g' /etc/apt/sources.list

Isso reduz a necessidade de escapar de um caractere problemático (o que poderia ser feito usando \ como escape).

* Tenho certeza de que há exceções, especialmente se estiver usando versões mais antigas de sed , mas não estou ciente de nenhuma limitação.

    
por user4556274 25.12.2016 / 21:47
6

Funcione assim:

sudo sed -i '\%^deb http://downloads.sourceforge.net/project/xenlism-wildfire/repo deb%d' /etc/apt/sources.list

Os problemas que consertei:

  • Use -i flag para modificar o arquivo no local. Sem isso, o comando apenas imprimiria a saída de sed na tela, sem atualizar o arquivo.
  • Em vez de usar s/// para substituir a linha pela string vazia, usei o comando d para excluir a linha.
  • Para a correspondência de padrões, em vez de /.../ , usei \%...% , porque % não aparece no padrão. Com / , todas as ocorrências de / teriam que ser substituídas.

Observe que, possivelmente, um filtro mais simples pode ser bom o suficiente. Por exemplo, se você souber que xenlist-wildfire é exclusivo no arquivo, esse comando mais simples funcionará também:

sudo sed -i '/xenlism-wildfire/d' /etc/apt/sources.list

Como neste exemplo não há / , eu poderia usar o filtro /.../ mais simples.

(Obrigado por @steeldriver para as ideias de melhoria.)

    
por janos 25.12.2016 / 21:50