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

У меня есть файл, где мне нужно добавить набор строк после некоторого шаблона. Проблема в том, что я не могу обрабатывать шаблон, который имеет несколько строк.

Шаблон

<stringProp name="TestPlan.user_define_classpath"></stringProp> </TestPlan> <hashTree> 

Строки, которые будут добавлены после этого шаблона

 <org.apache.jmeter.config.RestServerNodeElement guiclass="TestBeanGUI" testclass="org.apache.jmeter.config.RestServerNodeElement" testname="ATC_Test_Lab" enabled="true"> <stringProp name="TestPlan.comments"> </stringProp> <stringProp name="authbasic">${Basic}</stringProp> <stringProp name="authpassword">ENC(dsxxxxxxxxxxxWiu+FCzl5+A==)</stringProp> <stringProp name="authuser">${User}</stringProp> <stringProp name="extratag"></stringProp> 

Я попробовал команду sed с параметром -r как -r ниже, но это не сработало

 sed -i.bak '/^<stringProp name="TestPlan.user_define_classpath"></stringProp>/{N;/\n</TestPlan>/{N;/\n<hashTree>/r Config.jmx' $file 

файл Config.jmx имеет набор строк, которые необходимо добавить после этого шаблона.

Ошибка:-

 sed: -e expression #1, char 116: unterminated `s' command 

One Solution collect form web for “Как добавить несколько строк в файл после шаблона, который также является многострочным?”

Давайте избегаем скучных подходов, таких как чтение всей строки в виде строки на некоторых языках сценариев и замещение регулярных выражений встроенными символами новой строки.

Государственный механизм подхода в Awk. Каждая строка печатается. Если три требуемые строки появляются последовательно, переменная state увеличивается до 2 и печатается требуемый блок. Для любого другого ввода state истекает до нуля.

 1 1 { print state } state == 0 && /^<stringProp name="TestPlan.user_define_classpath"><\/stringProp>$/ { state++; next } state == 1 && /^<\/TestPlan>$/ { state++; next } state == 2 && /^<hashTree>$/ { print \ "<org.apache.jmeter.config.RestServerNodeElement guiclass=\"TestBeanGUI\"\n" \ "testclass=\"org.apache.jmeter.config.RestServerNodeElement\"\n" \ "testname=\"ATC_Test_Lab\" enabled=\"true\">\n" \ "<stringProp name=\"TestPlan.comments\"> </stringProp>\n" \ "<stringProp name=\"authbasic\">${Basic}</stringProp>\n" \ "<stringProp name=\"authpassword\">ENC(dsxxxxxxxxxxxWiu+FCzl5+A==)</stringProp>\n" \ "<stringProp name=\"authuser\">${User}</stringProp>\n" \ "<stringProp name=\"extratag\"></stringProp>\n" } 1 { state = 0; } 

Многострочное совпадение и вывод в TXR . Редкий подход здесь состоит в том, чтобы использовать директиву data для захвата двух точек во входном потоке (который представляет собой ленивый список строк), а затем функцию ldiff Lisp, чтобы получить диапазон линий между этими двумя точками (т. ldiff блок ), чтобы он мог выводиться с помощью tprint :

 @(repeat) @ (cases) @ (data start) <stringProp name="TestPlan.user_define_classpath"></stringProp> </TestPlan> <hashTree> @ (data end) @ (do (tprint (ldiff start end))) @ (output) <org.apache.jmeter.config.RestServerNodeElement guiclass="TestBeanGUI" testclass="org.apache.jmeter.config.RestServerNodeElement" testname="ATC_Test_Lab" enabled="true"> <stringProp name="TestPlan.comments"> </stringProp> <stringProp name="authbasic">${Basic}</stringProp> <stringProp name="authpassword">ENC(dsxxxxxxxxxxxWiu+FCzl5+A==)</stringProp> <stringProp name="authuser">${User}</stringProp> <stringProp name="extratag"></stringProp> @ (end) @ (or) @line @ (do (put-line line)) @ (end) @(end) 

В этом подходе мы могли бы добавить некоторые переменные в блок согласованного кода, а затем обратиться к ним в @(output) . Например, как s/regexp/replace/ может ссылаться на захваченные фрагменты через \1 , \2 , & и так далее. Предположим, что вместо статического слова TestPlan фрагмент текста и дублировать его во всех местах, где TestPlan появляется TestPlan :

 @(repeat) @ (cases) @ (data start) <stringProp name="@TYPE.user_define_classpath"></stringProp> </@TYPE> <hashTree> @ (data end) @ (do (tprint (ldiff start end))) @ (output) <org.apache.jmeter.config.RestServerNodeElement guiclass="TestBeanGUI" testclass="org.apache.jmeter.config.RestServerNodeElement" testname="ATC_Test_Lab" enabled="true"> <stringProp name="@TYPE.comments"> </stringProp> <stringProp name="authbasic">${Basic}</stringProp> <stringProp name="authpassword">ENC(dsxxxxxxxxxxxWiu+FCzl5+A==)</stringProp> <stringProp name="authuser">${User}</stringProp> <stringProp name="extratag"></stringProp> @ (end) @ (or) @line @ (do (put-line line)) @ (end) @(end) 

Попробуем эту версию:

 $ txr add.txr - foo foo bar bar blah blah <stringProp name="TestPlan.user_define_classpath"></stringProp> </TestPlan> <hashTree> <stringProp name="TestPlan.user_define_classpath"></stringProp> </TestPlan> <hashTree> <org.apache.jmeter.config.RestServerNodeElement guiclass="TestBeanGUI" testclass="org.apache.jmeter.config.RestServerNodeElement" testname="ATC_Test_Lab" enabled="true"> <stringProp name="TestPlan.comments"> </stringProp> <stringProp name="authbasic">${Basic}</stringProp> <stringProp name="authpassword">ENC(dsxxxxxxxxxxxWiu+FCzl5+A==)</stringProp> <stringProp name="authuser">${User}</stringProp> <stringProp name="extratag"></stringProp> blah blah blah blah <stringProp name="EvilPlan.user_define_classpath"></stringProp> </EvilPlan> <hashTree> <stringProp name="EvilPlan.user_define_classpath"></stringProp> </EvilPlan> <hashTree> <org.apache.jmeter.config.RestServerNodeElement guiclass="TestBeanGUI" testclass="org.apache.jmeter.config.RestServerNodeElement" testname="ATC_Test_Lab" enabled="true"> <stringProp name="EvilPlan.comments"> </stringProp> <stringProp name="authbasic">${Basic}</stringProp> <stringProp name="authpassword">ENC(dsxxxxxxxxxxxWiu+FCzl5+A==)</stringProp> <stringProp name="authuser">${User}</stringProp> <stringProp name="extratag"></stringProp> x x y y z z 

Когда TestPlan изменен на EvilPlan , он работает хорошо, и код читаем: многострочный текст представляется как есть. Если появляется символ @ , его нужно удвоить как @@ , но этого не произошло.

  • Как я могу сортировать файл .txt по двум столбцам?
  • В `sed` как я могу поместить один символ« & »между символами в строке?
  • Поиск и удаление строк, содержащих несколько шаблонов в файле
  • изменить конкретный столбец с помощью sed или awk
  • Создание и экспорт / импорт переменной с awk?
  • Как получить JSON STRING из данной строки
  • Извлечение записей фиксированной ширины без разделителя из одной строки
  • Удалите строки из файла до шаблона, если шаблон не существует
  • Как добавить некоторую строку в сочетании с шаблоном в конце строки с шаблоном
  • Извлечение данных из текстового файла
  • Заменить с sed до совпадения в строке
  • Linux и Unix - лучшая ОС в мире.