Скопируйте определенный текст из файла с несколькими строками и вставьте его в другой файл автоматически с помощью терминала

3

мой вопрос касается обработки текста:

В списке у меня есть IP-адреса и имена компьютеров в следующем формате:

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

Результат, который мне нужен:

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

Как я могу автоматически копировать IP-адреса и имена из списка в выходной файл с помощью командной строки? Не могли бы вы объяснить вашу команду, потому что жаль, когда мне приходится копировать / вставлять то, что я не понимаю.

    
задан Never.too.old.to.learn 17.12.2016 в 16:38
источник

2 ответа

5

В sed , если ваш список находится в файле с именем file , вы можете использовать:

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 ничего не печатают, пока мы не попросим его
  • /ss: / найти шаблон ss: (для соответствия строкам с IP address: )
  • N также читает следующую строку, чтобы мы могли присоединиться к ней.
  • ; разделяет команды, как в оболочке
  • s/old/new/ заменить old с new
  • s/\n// удалить новую строку между двумя строками
  • p напечатать строки, над которыми мы работали.

Когда вы увидите, что хотите, повторите команду, добавив в конце% > newfile , чтобы записать измененный файл в newfile

Более читаемо:

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 помогает записывать newfile и одновременно выводит результат)

    
ответ дан Zanna 17.12.2016 в 17:07
источник
6

Есть, вероятно, дюжина способов сделать это, используя различные утилиты обработки текста ( awk , perl ) и / или редакторы потоков ( sed , ed )

Один из способов: cut списка в разделителях двоеточия ( -d: ), сохраняя только второе поле ( -f2 ), а затем используйте xargs для передачи пар строк ( -l2 ) в качестве аргументов для 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
    
ответ дан steeldriver 17.12.2016 в 17:04