Дублируйте две строки, соответствующие двум разным шаблонам в XML-файле, используя SED или AWK.

Скорее всего, у ваших sudoers установлен безопасный путь _и он переопределяет PATH независимо от -E. Вы можете либо отключить его, либо исключить из него определенных пользователей, добавив их в exempt_group. См. sudoers (5)для получения дополнительной информации.

1
12.08.2019, 17:43
4 ответа

Я смог добиться того, чего хотел (На основе решения @Steve )в два этапа:

  1. Решить #1:
    awk '/valid="yes"/{print;a=$0; next} /.auth/{print $0"\n"a;gsub(/\.auth/,".newauth")}1' test.xml > newtest.xml
  1. Используя файл xml из предыдущего шага, решите #2:
    awk '/valid="yes"/ && /.auth/{print $0;gsub(/\.auth/,".newauth")}1' newtest.xml > final.xml

Можно ли объединить эти две операции в одну операцию awk?

0
28.01.2020, 00:03

Если вы действительно знаете, что делаете, и ваш XML не может быть отформатирован по-другому или содержать ловушки, вам не нужны два шага или сложные сценарии. Этот делает это просто за один проход:

sed -e '/valid="yes"/!b' -e '/\.auth/!N;p;s/\.auth/.newauth/'
  • /valid="yes"/!bпереходит(b)в конец скрипта для строк, не(!)содержащих шаблон, так что все остальное остается как было
  • /\.auth/!Nдля строк, не содержащих (!), содержащих .auth:, для этих строк мы добавляем Nдополнительную строку
  • pТекущее пространство шаблонов (может состоять из одной или двух строк ). Так или иначе, мы дублируем по мере необходимости
  • s/\.auth/.newauth/выполняет требуемую замену. Неизмененная строка/строки уже были pраспечатаны, теперь мы модифицируем ее для дубликата, и она будет напечатана в обычном конце обработки.
  • Шаг 5? Шаг 5 отсутствует.
0
28.01.2020, 00:03

Обновлено в соответствии с пересмотренным вопросом

Попробуйте это. Кажется, здесь отлично работает GNU awk 4.2.1.

awk '/valid="yes"/{print;if(!/<\/test>/){a=$0;getline;print $0"\n"a}gsub(/\.auth/,".newauth")}1' filename
0
28.01.2020, 00:03

Используя редактор sed, мы можем сделать это очень просто, как показано:

$ sed -e '
    /valid="yes"/!b
    h;/\.auth/G
    /\n/P;//s/.*\n//
    s/\.auth/.newauth/;t
    $q;N;/\.auth/!{P;D;}
    p;s//.newauth/
' test.xml
0
28.01.2020, 00:03

Теги

Похожие вопросы