Как вызвать команду sed в скрипте python? - PullRequest
0 голосов
/ 27 ноября 2018

С помощью скрипта Python я пытаюсь выполнить команду sed через subprocess.call(), как в скрипте.

file = "a.xml"
updateData= "(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=abc)(PORT=1234)))(CONNECT_DATA=(SERVICE_NAME=centraldb)))"
subprocess.call(["sed", "-i", 's#<DB_CONNECT_STRING>.*</DB_CONNECT_STRING>#<DB_CONNECT_STRING>updateData</DB_CONNECT_STRING>#', file])

Когда я запускаю команду в скрипте или команде оболочки, она работает нормально, но в python я получаю результат, говорящий «Нет входного файла».Любая идея, как исправить эту ошибку?

a.xml выглядит примерно так:

<?xml version = '1.0' encoding = 'UTF-8'?> 
<!DOCTYPE properties SYSTEM "java.sun.com/dtd/properties.dtd"> 

<properties> <!-- Database server details --> 
    <DB_CONNECT_STRING>(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=abc)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=cdb)))</DB_CONNECT_STRING> 
</properties>

1 Ответ

0 голосов
/ 28 ноября 2018

Вы действительно не нуждаетесь или не хотите использовать для этого внешний подпроцесс.

import fileinput

updateData = "(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=abc)(PORT=1234)))(CONNECT_DATA=(SERVICE_NAME=centraldb)))"

for line in fileinput.input('a.xml', inplace=True):
    try:
        prefix, tail = line.split('<DB_CONNECT_STRING>', 1)
        _, suffix = tail.split('</DB_CONNECT_STRING>', 1)
        line = prefix + '<DB_CONNECT_STRING>' + updateData + '</DB_CONNECT_STRING>' + suffix
    except ValueError:
        # <DB_CONNECT_STRING> or close tag not found -- don't replace
        pass
    print(line)

Для записи updateData внутри кавычек волшебным образом не превращается в значение переменной updateDataтак что это была еще одна проблема с вашей попыткой.

Специальная обработка XML по-прежнему является серьезной проблемой;правильное решение будет использовать парсер XML и, возможно, XSLT для обновления файла.(С другой стороны, если вы точно знаете, что строка никогда не будет содержать ничего кроме начального и конечного тегов, вы можете несколько упростить приведенный выше сценарий. В-третьих, специальные s-выражения внутри тегов XMLпохоже, что вы действительно хотите переосмыслить формат файла конфигурации более тщательно, если у вас есть хоть какой-то контроль над этим.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...