Sed para modificar arquivo de hosts

Sed para modificar arquivo de hosts

Eu tenho um arquivo de texto, modifyhostslist.txtque contém entradas que correspondem às entradas encontradas no meu hostsarquivo. Nem todas as entradas no meu hostsarquivo precisam ser modificadas, apenas as entradas também encontradas no arquivo modifyhostslist.txt.

As entradas encontradas modifyhostslist.txtdevem ser comentadas no hostsarquivo.

Linha de amostra (entrada) encontrada em modifyhostslist.txt:127.0.0.1 www.domain.com

O seguinte serve como sequência de comentários:#%%#

Tentei usar sedpara completar a tarefa, mas até agora não tive sucesso. Aqui está minha tentativa mais recente:

while read line; do 
   sed -i 's/'"$line"'/#%%#'"$line"'/' /system/etc/hosts;
done < modifyhostslist.txt

Além disso, os #%%#comentários serão removidos em intervalos específicos, retornando assim o hostsarquivo à sua condição original. Suspeito que simplesmente reorganizar o comando usado para inserir os comentários também pode ser usado para remover os comentários do hostsarquivo.

Parece que o awkcomando pode funcionar, mas também não tenho certeza de como usá-lo.

Responder1

Você usou o comando:

while read line; do 
   sed -i 's/'"$line"'/#%%#'"$line"'/' /system/etc/hosts;
done < modifyhostslist.txt

Contanto que as linhas modifyhostslist.txtcorrespondam às linhas de /system/etc/hosts, esse comando realmente deve funcionar.

Se as linhas parecerem idênticas ao olho, mas o comando ainda não funcionar, a causa pode ser uma incompatibilidade entre os finais de linha (invisíveis). Os arquivos DOS/Windows têm finais de linha de dois caracteres, enquanto Unix e Mac usam finais de linha de um caractere. Se for esse o problema, a solução é remover os caracteres ofensivos. Como hostsé um arquivo de sistema Unix, espero que ele tenha os finais de linha corretos e, portanto, precisamos remover os \rcaracteres excedentes do modifyhostslist.txt arquivo. Isso pode ser feito da seguinte forma:

while read line; do 
   sed -i 's/'"$(echo "$line" | tr -d '\r')"'/#%%#'"$line"'/' /system/etc/hosts;
done < modifyhostslist.txt

informação relacionada