Copie o texto específico de um arquivo de múltiplas linhas e cole-o em outro arquivo automaticamente usando o terminal

3

minha pergunta é sobre processamento de texto:

Em uma lista, tenho os endereços IP e os nomes dos computadores no seguinte formato:

IP address: 192.168.1.25
Computer name: computer7office
IP address: 192.168.1.69
Computer name: computer22office
IP address: 192.168.1.44
Computer name: computer12personal

A saída de que preciso:

This computer ip address is xxx.xxx.x.xx and is under the name zzzzzzzzzz

Como posso copiar automaticamente os IPs e nomes da lista para o arquivo de saída usando a linha de comando? Você poderia por favor explicar o seu comando porque é uma pena quando eu tenho que copiar / colar coisas que eu não entendo.

    
por Never.too.old.to.learn 17.12.2016 / 16:38

2 respostas

5

Em sed , supondo que sua lista esteja em um arquivo chamado file , você poderia usar:

sed -n '/ss: /N;s/\n//;s/IP address:/This computer ip address is/;s/Computer name:/ and is under the name/p' file
  • -n não imprime nada até pedirmos
  • /ss: / encontra o padrão ss: (para corresponder às linhas com IP address: )
  • N leu a próxima linha também para que possamos nos juntar a eles
  • ; separa comandos, como no shell
  • s/old/new/ replace old com new
  • s/\n// exclui a nova linha entre as duas linhas
  • p imprime as linhas em que trabalhamos

Quando você vir o que deseja, repita o comando adicionando > newfile no final para gravar o arquivo modificado em newfile

Mais claramente:

sed -n '{
    /ss: /N
    s/\n//
    s/IP address:/This computer ip address is/
    s/Computer name:/ and is under the name/p
}' file | tee newfile

( tee escreve com ajuda no newfile e exibe a saída ao mesmo tempo)

    
por Zanna 17.12.2016 / 17:07
6

Há provavelmente uma dúzia de maneiras de fazer isso, usando vários utilitários de processamento de texto ( awk , perl ) e / ou editores de fluxo ( sed , ed )

Uma maneira seria cut a lista nos delimitadores de dois pontos ( -d: ), mantendo apenas o segundo campo ( -f2 ) e, em seguida, usar xargs para passar pares de linhas ( -l2 ) como argumentos para printf :

$ cut -d: -f2 list.txt | xargs -l2 printf 'This computer ip address is %s and is under the name %s\n'
This computer ip address is 192.168.1.25 and is under the name computer7office
This computer ip address is 192.168.1.69 and is under the name computer22office
This computer ip address is 192.168.1.44 and is under the name computer12personal
    
por steeldriver 17.12.2016 / 17:04