Вставить строки после многострочного соответствия регулярному выражению

У меня есть XML-файл, который мне нужно добавить после определенного набора тегов. В основном файловая структура выглядит так:

<key>servers</key> <dict> ... Server Details ... </dict> 

Я хотел бы соответствовать по строкам:

 <key>servers</key> <dict> 

и добавьте блок XML, определяющий соединение с сервером сразу после <dict> . У меня есть новый блок XML в его собственном текстовом файле, поскольку он довольно длинный.

Я посмотрел на sed и awk чтобы сделать это, но я прислонился к стене. Я также видел примеры использования perl для этого, но я не очень хорошо знаком с Perl. Из того, что я понимаю, sed и awk не очень хороши при многострочном сопоставлении.

Причина, по которой мне нужно выполнить многострочное сопоставление, заключается в том, что <dict> часто используется в XML-файле, и мне нужно добавить блок в раздел <key>servers</key> , а не заменять его все содержимое.

5 Solutions collect form web for “Вставить строки после многострочного соответствия регулярному выражению”

Вы можете сделать что-то вроде:

 awk '{print} $0 == "<dict>" && previous == "<key>servers</key>" { system("cat other-file.xml") } {previous = $0}' 
 sed '/keys_line_1/,/keys_line_last/{/keys_line_last/{ h;s/unique_split_point.*//;r /path/to/insert/file x;s/.*unique_split_point//;G }}' 

sed не совсем прощает, когда речь идет о необходимости корректировки гипотезы. Все, что делает sed , является прямым результатом того, что он только что сделал, и поэтому очень незначительная ошибка в деталях может кардинально изменить результаты.

Таким образом, без немного сумасшедшего и много терпения, отладка sed скрипта может быть расстраивающим делом, но, учитывая эти качества, награды могут быть значительными. Я настоятельно рекомендую использовать команду l ook во время процесса, насколько это возможно, если вы сделаете попытку.

 sed ...;l;...complicated_script...;l;... 

Собственно, второй раз на ваш вопрос, и я думаю, что это легче, чем я предполагал сначала. Все, что вам действительно нужно (я думаю), состоит в том, чтобы расширить пространство шаблонов на одну строку в случае соответствия серверов . По умолчанию sed буферирует только строку за цикл, но команды N , P и D обеспечивают прямой контроль над этим поведением.

На самом деле, я считаю, что я неправильно понял вопрос изначально – я хотел бы вставить какой-то текст в строку, а не в блок строк.

Так что вам может понадобиться:

 sed '\|<key>servers</key>|,/<dict>/N;P /\n<dict>/!D;s/.*\n//;r /path/to/file' 

Таким образом, все строки, кроме тех, в которых вы заинтересованы, – диапазон от вашего сервера через ваш диктовский совпадение, как только это возможно, удалится из буфера редактирования, и вы только выберете свой целевой файл после первого диктовского соответствия, следующего за любым последовательность вашего * сервера, и единственная точка, в которой файл когда-либо добавляется в выходной буфер, непосредственно следует за вашим соответствием dict, если ему предшествует \n ewline.

Будет что-то вроде этой работы?

 sed '\|<key>servers</key>|{n \|<dict>| r other-file.xml }' file.xml 

Не могли бы вы быть более конкретными в отношении ожидаемого результата? Я бы использовал python3 и

 PATH = '/My/Path/' FILE = 'MyFile.xml' for i, line in enumerate(open(PATH+FILE, 'r')): ... # 

так как легко поймать \n , а строка заканчивается на одну, поэтому поиск строк, которые вы ищете, легко

но мне нужно лучше понять результат, чтобы продолжить

Поскольку вы добавили тег Perl:

 perl -pE 'BEGIN{ $/ = "<key>servers</key>\n<dict>\n"; $content = `cat file.xml` } $_.=$content' your_input_file 
  • Как разбирать XML-файл в сценарии оболочки
  • Как заменить «&» на «& amp;», за исключением того, что уже является частью XML-объекта?
  • Как добавить тег для xml из файла, существует с помощью оболочки linux
  • Egrep несколько строк в файле XML
  • Как добавить строку, которая не начинается с '<' до предыдущей строки
  • Извлекать и удалять первое вхождение XML-тега несколько раз
  • Большая замена в XML
  • Поиск заменить в файле XML с помощью sed или awk
  • Удалить строку с пробелами и цитатами из xml-файла
  • Как преобразовать общий формат XML-формата в формат свойств String из XML-файла с помощью скрипта ksh
  • Сценарий оболочки или команда для вырезания текста и двоичных файлов выдержки из больших файлов журнала
  • Interesting Posts

    Сортировка некоторых строк в файле

    Как избавиться от среды рабочего стола и использовать только оконный менеджер?

    выходные журналы в crontab не работают

    Является ли это целесообразным преобразование в LVM и отдельное / домашнее крепление?

    Подсветка клавиатуры Asus G53S

    Настройка разрешений SVN с помощью davsvnauthz

    Правильное поведение ловушек EXIT и ERR при использовании `set -eu`

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

    ifdown bond0: 0 снимает bond0 с ним

    установка локальной сетевой папки в Ubuntu

    Как звуковая проблема Linux может повлиять на Windows в конфигурации с двойной загрузкой?

    Отладка медленных запросов в MariaDB / MySQL

    Потенциальные источники задержки задержки 5us-20us при отправке длинного блока последовательных данных на устройство tty?

    Признание таблицы разделов GPT, созданной с разным размером логического сектора

    Как установить другую среду рабочего стола в Linux (Gnome -> Xfce)?

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