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

У меня есть 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 uttribut документа xml с помощью селектора
  • Как разобрать XML в CSV с помощью сценария оболочки?
  • Преобразование операторов XML в SQL INSERT с использованием командной строки
  • Создание сценария оболочки для записи в файл XML
  • Удалить узел XML, содержащий определенный элемент
  • Очистка объединенных файлов XML
  • Заменить текст с помощью sed и сохранить часть исходного текста
  • Разделение файлов в Unix с использованием значений в файле
  • Значения отображения xmllint более 1 атрибута в одном исполнении
  • Альтернатива xmllint для проверки правильности xml
  • Есть ли инструмент командной строки для проверки файлов RDF?
  • Заменить значения из файла1 в файл2 awk
  • Interesting Posts

    Используйте ту же ссылку на файл как для Linux, так и для Windows

    Как я могу исправить «insserv: существует ли цикл между сервисами mountnfs и nfs-common, если они запущены» в Debian wheezy?

    Может ли пользовательский языковой стандарт жить под ~ /?

    Сообщение об ошибке cp использует разные цитаты на Ubuntu 12.04 (?) и Fedora 24

    Как настроить факс-карту модема на OpenBSD?

    Как сделать src.rpm распаковать источник в любой каталог, который я хочу?

    Отсутствует индикатор активной видеокарты

    Разница между systemd wpa_supplicant.service и wpa_supplicant@wlan0.service?

    Не удается записать на недавно созданный раздел EXT4

    init: это пользовательский поток или поток ядра?

    Проблемы с perl-скриптом, который должен удалять строки в строках одного файла из другого файла

    Как сделать devilspie матч Spotify windows?

    Восстановить поврежденный системный каталог (например, / lib)

    -not -name не работает с поиском

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

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