Команда не возвращает свой статус выхода($?
)в стандартном выводе. Подстановка команды($(...)
)фиксирует стандартный вывод.
Вместо этого просто
#!/bin/sh
if ! /usr/bin/python /etc/scripts/backup.py; then
echo 'PROBLEM'
else
echo 'OK'
fi
Это выберет первую ветвь и напечатает PROBLEM
, если скрипт Python завершится с ненулевым -статусом выхода.
Вы можете прочитать оператор if
как «Если сценарий не удался».
Если вы хотите избавиться от!
:
#!/bin/sh
if /usr/bin/python /etc/scripts/backup.py; then
echo 'OK'
else
echo 'PROBLEM'
fi
Вы можете прочитать утверждение if
как «Если скрипт выполнился успешно».
Ошибка , которую вы получаете, связана с тем, что скрипт ничего не выводит, а это означает, что подстановка команды будет пустой. Поскольку он не заключен в кавычки, команда, которую оболочка попытается выполнить, будет выглядеть как
if [ -gt 0 ]
Это синтаксическая ошибка.
При цитировании подстановки команды вы, по сути, пытаетесь выполнить
if [ "" -gt 0 ]
и оболочка не может сравнить пустую строку как целое число.
Предполагая правильно сформированный документ XML:
<root>
<asd>blablabla</asd>
<dsa>-some stuff
-other stuff
final stuff.</dsa>
</root>
Вы можете просто использовать xmlstarlet
для замены содержимого узла верхнего -уровня asd
содержимым узла dsa
следующим образом:
$ xmlstarlet ed -u '/root/asd' -x '/root/dsa/text()' file.xml
<?xml version="1.0"?>
<root>
<asd>-some stuff
-other stuff
final stuff.</asd>
<dsa>-some stuff
-other stuff
final stuff.</dsa>
</root>
Более сложный пример, требующий замены каждого узла asd
его родственным узлом dsa
:
<?xml version="1.0"?>
<root>
<node1>
<asd>blablabla</asd>
<dsa>-some stuff
-other stuff
final stuff.</dsa>
</node1>
<node2>
<asd>REPLACE ME</asd>
<dsa>REPLACE WITH THIS</dsa>
</node2>
</root>
Это можно сделать с помощью
$ xmlstarlet ed -u '//asd' -x '../dsa/text()' file.xml
<?xml version="1.0"?>
<root>
<node1>
<asd>-some stuff
-other stuff
final stuff.</asd>
<dsa>-some stuff
-other stuff
final stuff.</dsa>
</node1>
<node2>
<asd>REPLACE WITH THIS</asd>
<dsa>REPLACE WITH THIS</dsa>
</node2>
</root>
На этот вопрос уже был дан ответ:Как я могу использовать sed для замены многострочной строки -?
Но я настоятельно рекомендую использовать второй ответ в этом сообщении :perl
. Многие люди могут отойти от PERL, но изначально он использовался именно для таких вещей.
$ perl -0777 -i.original -pe 's/a test\nPlease do not/not a test\nBe/igs' alpha.txt
Как видите, в шаблоне разрешены символы новой строки. Пожалуйста, смотрите ответ для более подробной информации.
Вы можете попробовать это:
c="$(sed -n '\#<dsa>#,\#</dsa>#p' file | sed 's#<dsa>\|</dsa>##')"
sed -e "s#<asd>.*</asd>#<asd>${c//$'\n'/\\n}</asd>#" -e '\#<dsa>#,\#</dsa>#c<dsa></dsa>' file
Выход:
<asd>-some stuff
-other stuff
final stuff.</asd>
<dsa></dsa>
Получить содержимое между тегами 'dsa':
c="$(sed -n '\#<dsa>#,\#</dsa>#p' file | sed 's#<dsa>\|</dsa>##')"
Вставьте содержимое в теги asd:
sed -e "s#<asd>.*</asd>#<asd>${c//$'\n'/\\n}</asd>#"
Изменить теги и содержимое 'dsa' на просто<dsa></dsa>
'\#<dsa>#,\#</dsa>#c<dsa></dsa>'
Если xmlstarlet
является опцией -, может быть, через это xmlstarlet GitHub Action -, затем задано
$ cat file.xml
<?xml version="1.0"?>
<foo>
<asd>blablabla</asd>
<dsa>-some stuff
-other stuff
final stuff.</dsa>
</foo>
вы можете сделать что-то вроде
$ xmlstarlet edit --update '//asd' --value "$(xmlstarlet select -t -v '//dsa' file.xml)" file.xml
<?xml version="1.0"?>
<foo>
<asd>-some stuff
-other stuff
final stuff.</asd>
<dsa>-some stuff
-other stuff
final stuff.</dsa>
</foo>
Ссылки:
Хорошо, хорошо, мы должны использовать синтаксический анализатор XML -. но с Perl:
perl -0pe 'm!<dsa>(.*?)</dsa>!s and $a=$1;
s!<asd>.*?</asd>!<asd>$a</asd>!s' example