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

Этот один лайнер будет искать имя: 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; } } } 

  • «Дополнительные символы после команды» в команде sed a
  • Извлечь начальное и конечное положение общего идентификатора
  • Как редактировать файлы на месте при выполнении операции над значениями, соответствующими найденному шаблону?
  • sed error: «\ 1 не определено в RE» под OS X
  • Как использовать инструменты GNU для извлечения и объединения двух подстрок одной и той же строки?
  • Присвоить результат sed переменной
  • Добавление значения ко всем столбцам
  • Объединение двух файлов, по одному столбцу за раз
  • 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

    Если ssh-add будет тихим, если ключ уже есть

    Могу ли я удалить GUI из Debian?

    Что делают эти параметры загрузчика в установщике OpenSUSE?

    Извлеките файлы с помощью cpio, где один или несколько путей могут содержать пробелы

    Не удалось выполнить проверку IP-адреса при первой загрузке

    Получение последовательности fasta с использованием информации файла с файла из локально установленного файла

    Искать значение только в одном столбце wo с помощью awk, sed или perl

    Какова цель -i и -s вариантов bash?

    Есть ли более эффективный способ дефрагментации Linux-памяти, кроме перезагрузки?

    Установите постоянную переменную среды для всех пользователей

    Обновление и установка пакета невозможны: E: Не удается найти пакет! Linux Mint 17.3

    Как остановить systemd-logind и не активироваться позже?

    Терминалу иногда не удается найти исполняемые файлы в локальном каталоге

    Получить последнее измененное содержимое с момента последнего чтения

    Сравните две записи файлов, чтобы найти идентичные файлы, но игнорировать расширения

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