Скорее всего, у ваших sudoers установлен безопасный путь _и он переопределяет PATH независимо от -E
. Вы можете либо отключить его, либо исключить из него определенных пользователей, добавив их в exempt_group
. См. sudoers (5)для получения дополнительной информации.
Я смог добиться того, чего хотел (На основе решения @Steve )в два этапа:
awk '/valid="yes"/{print;a=$0; next} /.auth/{print $0"\n"a;gsub(/\.auth/,".newauth")}1' test.xml > newtest.xml
awk '/valid="yes"/ && /.auth/{print $0;gsub(/\.auth/,".newauth")}1' newtest.xml > final.xml
Можно ли объединить эти две операции в одну операцию awk?
Если вы действительно знаете, что делаете, и ваш 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
распечатаны, теперь мы модифицируем ее для дубликата, и она будет напечатана в обычном конце обработки. Обновлено в соответствии с пересмотренным вопросом
Попробуйте это. Кажется, здесь отлично работает GNU awk 4.2.1.
awk '/valid="yes"/{print;if(!/<\/test>/){a=$0;getline;print $0"\n"a}gsub(/\.auth/,".newauth")}1' filename
Используя редактор 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