файл поиска для строки (взятый из файла), затем замените любой экземпляр другой строки, которая попадает в первое совпадение

Этот один лайнер будет искать имя: 0602, а затем заменить любой экземпляр типа ### на тип 700 до следующего имени.

sed '/Name: R0602/,/Name.*$/ s/type .*;/type 700;/' file2 

Я хочу использовать что-то похожее на этот один лайнер, но я хочу использовать список имен в файле1 для поиска файла2. После того, как найден файл строки string1, он затем заменяет любой экземпляр строки2 до тех пор, пока он не достигнет конца раздела этого имени, а затем сделает то же самое для следующей строки в файле1.

File1

 Name: 0602 Name: 0603 Name: 0604 

file2:

 # Name: R0601 Container 4 { row 12 type 2 { set 1 10 { name "C4"; type 300; } set 11 20 { name "C5"; type 100; } set 21 20 { name "C6"; type 300; } set 31 40 { name "C7"; type 200; } set 31 40 { name "C7"; type 1200; } } } # Name: R0602 Container 5 { row 12 type 2 { set 1 10 { name "C4"; type 300; } set 11 20 { name "C5"; type 100; } set 21 20 { name "C6"; type 300; } set 31 40 { name "C7"; type 300; } set 31 40 { name "C7"; type 1100; } } } # Name: R0603 Container 6 { row 12 type 2 { set 1 10 { name "C4"; type 200; } set 11 20 { name "C5"; type 100; } set 21 20 { name "C6"; type 300; } set 31 40 { name "C7"; type 500; } set 31 40 { name "C7"; type 1100; } } } # Name: R0604 Container 6 { row 12 type 2 { set 1 10 { name "C4"; type 200; } set 11 20 { name "C5"; type 100; } set 21 20 { name "C6"; type 300; } set 31 40 { name "C7"; type 500; } set 31 40 { name "C7"; type 1100; } } } # Name: R0605 Container 6 { row 12 type 2 { set 1 10 { name "C4"; type 200; } set 11 20 { name "C5"; type 100; } set 21 20 { name "C6"; type 300; } set 31 40 { name "C7"; type 500; } set 31 40 { name "C7"; type 1100; } } } 

  • Grepping и sedding IP из ip addr show
  • awk или sed для соответствия регулярному выражению в определенной строке, выход true, если успех, false, иначе
  • regex заменить текст в XML-файле в узле из командной строки
  • Добавьте двойную кавычку, если между словами в столбце есть пробел
  • Сумма альтернативных значений в столбце с использованием команды sed или nawk
  • Разделить текстовый файл на строки с фиксированным числом слов
  • Извлечение данных с помощью awk, когда некоторые строки имеют пустые / отсутствующие значения
  • Как сопоставить шаблон, удалить шаблон, а также следующую и предыдущую строку в Solaris 10
  • 2 Solutions collect form web for “файл поиска для строки (взятый из файла), затем замените любой экземпляр другой строки, которая попадает в первое совпадение”

    Короткий скрипт awk

     awk ' NR == FNR { names["R"$2]; next } $2 == "Name:" { replace = ($3 in names) } $1 == "type" && replace { sub(/type .*/, "type 700;") } 1 ' file1 file2 

    NR и FNR являются встроенными переменными awk. NR подсчитывает общее количество линий, видимых до сих пор. FNR – это количество строк в текущем файле, просмотренном до сих пор. NR == FNR – это awk-идиома, которая означает «Я работаю в первом файле данных» – единственный файл, для которого текущий номер записи будет равен общему номеру записи.

    Итак, читая первый файл, мы хотим сохранить «ключи», которые находятся во втором столбце. Хранение их в качестве ключа ассоциативного массива «имена» – это удобное место, если использовать оператор, который мы используем позже. Я добавляю букву «R» к ключу, потому что второй файл имеет это.

    Когда $2 == "Name:" , мы находимся в верхней части раздела. Мы хотим заменить значения типа, если третье слово в этой строке было замечено в первом файле. ($3 in names) проверяет, появляется ли 3-е слово в качестве ключа в ассоциативном массиве names . Если он есть, мы будем выполнять замены для любых последующих строк, где первое слово является «типом».

    Последняя строка сценария интересна. 1 – это еще одна идиоматическая стенограмма, указывающая awk на печать текущей строки. awk-программы представляют собой серию пар condition {action} : если условие выполнено, выполните указанные действия. Условие может быть опущено, и в этом случае действие выполняется для каждой строки. Условие может быть задано без блока действий, и в этом случае действие по умолчанию предназначено для печати текущей строки. awk обрабатывает пустые строки и нуль как false, поэтому 1 – это условие, которое всегда верно. Когда я чувствую себя более подробным, я пишу {print} вместо 1 чтобы сделать его более очевидным.

    С скриптом GNU awk, как показано ниже:

     NR == FNR { strt=1 } strt == 0 { if (match($0,/Name/)) { id=substr($0,RSTART,length($0)) id=gensub("R","","g",id) } file2[id]=file2[id]"\n"$0 } FNR == 1 && NR != 1 { strt=0 file2[$0]="" } strt == 1 { file1[$0]=$0 } END { for (i in file2) { if (file1[i] != "") { resp=gensub(/[[:blank:]]{5}type.*;/," type 700;","g",file2[i]) print resp } else { print file2[i] } } } , NR == FNR { strt=1 } strt == 0 { if (match($0,/Name/)) { id=substr($0,RSTART,length($0)) id=gensub("R","","g",id) } file2[id]=file2[id]"\n"$0 } FNR == 1 && NR != 1 { strt=0 file2[$0]="" } strt == 1 { file1[$0]=$0 } END { for (i in file2) { if (file1[i] != "") { resp=gensub(/[[:blank:]]{5}type.*;/," type 700;","g",file2[i]) print resp } else { print file2[i] } } } 

    Прочитайте два файла в отдельных массивах (файл1, файл2), например, «Имя: 0603». В конце зациклируйте массив file2, соответствующий файлу 1. Если есть запись в файле1, используйте gensub для соответствия шаблону и замены, иначе просто напечатайте запись в файле2.

    действие с:

      awk -f scriptfile file1 file2 
    Interesting Posts

    System Mangled: Как отменить sudo apt-get удалить gnupg

    сценарий оболочки отлично работает при выполнении в терминале, но ошибки при запуске как параллельная программа

    загрузить ssh-ключ в github из командной строки

    Массовое создание файлов с bash

    Проблема с разрешением экрана Debian 8 (Jessie)

    установить флаг для удаления дубликатов записей из файла на основе некоторых значений записи

    Какой Linux может проверить все его файлы / пакеты, такие как debsums (Debian), но еще?

    Как создать файл с именем, указанным в кодировке ASCII?

    Собирает ли busybox chmod 03755 любые записи ввода / вывода на диск, если права на каталоги уже установлены правильно?

    Доступная файловая архивная система с веб-сайтом ui?

    Введите количество совпадений и количество строк совпадения

    Практическое использование uname в chroot?

    Есть ли способ контролировать световую ценность логотипа Apple на MacBook?

    Как разморозить после случайного нажатия Ctrl-S в терминале?

    Какой драйвер NVIDIA я должен использовать?

    Linux и Unix - лучшая ОС в мире.