Intereting Posts
Подключение к серверу dnsmasq извне Скрипт для запрета IP-адресов, которые пытаются ввести root на сервере консоль, отображающая символ цитаты из gcc wongly Изменение NTP-сервера на основе доступных подключений Корневая файловая система почти полная – я должен волноваться? Рестарт, перезагрузка или остановка службы systemd влияют на ExecStartPost? Помогите с удалением и командой sed Временно заморозить процесс при взаимодействии оболочки Что означает статус «активный (выходящий)» для (пользовательского) сервиса? Не удалось расшифровать раздел LUKS Не удается удалить рубиновый камень Vagrant для установки Vagrant через RPM rts5139 / rtsx_usb borked в 3.15+ Разрешение 2560×1440 по HDMI с ноутбуком с NVIDIA Optimus и Ubuntu 15.10 Можно ли предотвратить потребление энтропии при запуске программы? Попытка cp пути с пробелами не работает при написании сценария, но повторение и вставка выполняется успешно?

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

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

Шаблон

<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 

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

Государственный механизм подхода в 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 , он работает хорошо, и код читаем: многострочный текст представляется как есть. Если появляется символ @ , его нужно удвоить как @@ , но этого не произошло.