Команда Sed: поиск шаблона с подстановочными знаками до и после целевой строки - PullRequest
1 голос
/ 06 мая 2020

Содержимое образца. xml похоже на приведенное ниже.

<Name="com.name1.sample.date" level="ERROR"/>
<Name="com.name2.test" level="WARNING">
<Name="com.name3.type.yeah.trace" additivity="false" level="DEBUG">

Я пытаюсь использовать sed и просто заменяю значение "параметра уровня" во всех строках. Однако использование (*) в качестве подстановочного знака не работает для сопоставления с шаблоном.

Я бы хотел, чтобы результат был таким, как показано ниже.

<Name="com.name1.sample.date" level="INFO"/>
<Name="com.name2.test" level="WARN">
<Name="com.name3.type.yeah.trace" additivity="false" level="UPDATE">

В основном: из этого шаблона *level="<pattern>"* К этому шаблону *level="<updated>"*

Где * может быть любым шаблоном.

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

sed 's|="'"$logger_type"'".*|="'"$logger_type"'" level="'"$update_check"'"/>|g'

Где $ logger_type - это имя, на которое ссылается, и его уровень должен быть обновлен до любого содержимого $ update_check

1 Ответ

0 голосов
/ 06 мая 2020

В основном: Из этого шаблона *level="<pattern>"* К этому шаблону *level="<updated>"*

Поскольку ваш ввод ориентирован на строку, мы можем использовать "<i>logger_type</i>" как адрес regexp для обработки только строк, соответствующих регулярному выражению; тем самым мы можем упростить шаблон подстановки, указав только level="…" и оставив другие атрибуты (например, additivity) такими, какие они есть.

sed /\"$logger_type'"/s/level="\w*"/level="'$update_check\"/ sample.xml
...