Заменить текст в файле многострочной строкой.

Команда не возвращает свой статус выхода($?)в стандартном выводе. Подстановка команды($(...))фиксирует стандартный вывод.

Вместо этого просто

#!/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 ]

и оболочка не может сравнить пустую строку как целое число.

2
24.04.2020, 04:09
5 ответов

Предполагая правильно сформированный документ 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>

2
19.03.2021, 02:26

На этот вопрос уже был дан ответ:Как я могу использовать sed для замены многострочной строки -?

Но я настоятельно рекомендую использовать второй ответ в этом сообщении :perl. Многие люди могут отойти от PERL, но изначально он использовался именно для таких вещей.

$ perl -0777 -i.original -pe 's/a test\nPlease do not/not a test\nBe/igs' alpha.txt

Как видите, в шаблоне разрешены символы новой строки. Пожалуйста, смотрите ответ для более подробной информации.

1
19.03.2021, 02:26

Вы можете попробовать это:

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>'
0
19.03.2021, 02:26

Если 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>

Ссылки:

1
19.03.2021, 02:26

Хорошо, хорошо, мы должны использовать синтаксический анализатор XML -. но с Perl:

perl -0pe 'm!<dsa>(.*?)</dsa>!s and $a=$1;
           s!<asd>.*?</asd>!<asd>$a</asd>!s' example
0
19.03.2021, 02:26

Теги

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