Como anexar alguma string combinada com o padrão no final da linha com o padrão

1

Eu quero acrescentar .com no final da linha para cada linha que corresponda ao padrão no arquivo / etc / hosts.

Exemplo de conteúdo de arquivo:

127.0.0.1   localhost
1.2.3.4 hostname1 hostname1.xyz hostname1.xyz.  
1.2.3.5 hostname2 hostname2.xyz hostname2.xyz.  
1.2.3.6 hostname3 hostname3.xyz hostname3.xyz.  

Eu quero que seja como abaixo:

127.0.0.1   localhost localhost.com
1.2.3.4 hostname1 hostname1.xyz hostname1.xyz. hostname1.xyz.com  
1.2.3.5 hostname2 hostname2.xyz hostname2.xyz. hostname2.xyz.com  
1.2.3.6 hostname3 hostname3.xyz hostname3.xyz. hostname3.xyz.com

Algum comando sed ou awk para obter esse efeito?

    
por Krishna Pandey 01.06.2016 / 10:20

2 respostas

2

com awk :

$ awk '$0 = $0 " " $NF ($NF ~ /\.$/ ? "" : ".") "com"' <file
127.0.0.1   localhost localhost.com
1.2.3.4 hostname1 hostname1.xyz hostname1.xyz. hostname1.xyz.com
1.2.3.5 hostname2 hostname2.xyz hostname2.xyz. hostname2.xyz.com
1.2.3.6 hostname3 hostname3.xyz hostname3.xyz. hostname3.xyz.com
    
por 01.06.2016 / 11:02
1

Solução usando Perl, faz edição no local

perl -i -pe 's/(\s\S+?)(\.?)\s*$/$1$2$1.com\n/' /etc/hosts
  • \s corresponde a um caractere de espaço em branco
  • \S+? não-ganancioso corresponde a 1 ou mais caracteres não-brancos
  • \.? greedy match 0 ou 1 vezes o. personagem (para cuidar de possíveis extras. no final da linha)
  • \s*$ greedy corresponde a qualquer caractere de espaço em branco no final da linha
  • $1$2 retém a última coluna, excluindo os caracteres de espaço em branco no fim da linha
  • $1.com\n add .com e caractere de nova linha

altere -i para -i.bkp para ter um backup (/etc/hosts.bkp) do arquivo original

Observação: essa expressão regular não funciona com sed , pois o BRE / ERE não é compatível com correspondência não-voraz

    
por 02.06.2016 / 14:29