Как вставить символ новой строки после каждого вхождения определенного XML-тега в файл?

Как упомянул @SHW, вопрос на самом деле касается выполнения программы python в сценарии оболочки (без запуска сценария python напрямую с помощью./disk.py)

Таким образом, расширяя ответ @SHW, ваш сценарий оболочки должен выглядеть примерно так:

#!/bin/bash
/usr/bin/python /absolute/path/to/your/disk.py

Обратите внимание на /usr/bin/pythonвместо просто python; использование абсолютных путей помогает сценарию точно знать, какой python использовать (, чтобы найти абсолютный путь к вашему установленному python usewhich python).

Та же история с использованием абсолютных путей в скрипте Python вместо простого disk.py. В моем случае я пытался запустить приложение Django из своего сценария bash, поэтому мне пришлось добавить абсолютный путь к моему manage.py, чтобы оно работало правильно.

Кроме того, что касается заголовка вашего bash-скрипта, есть несколько альтернатив #!/bin/bash. Пожалуйста, взгляните на этот вопрос, чтобы узнать больше об этом.

Удачи.

1
21.07.2020, 23:39
5 ответов

Возможно, это не самое элегантное решение, но оно работает:

sed 's/\(<\/Data>\)/\1\n/ig'
0
18.03.2021, 23:18

sed '/<\/Data>/ a \\n' будет вставлять новую строку, однако, если строка существует более одного раза в строке (типичный xml может быть одной длинной строкой )он просто добавляет новую строку после нее, а не после каждого вхождения.

Если вам действительно нужна новая строка после каждого вхождения, sed 's/\(<\/Data>\)/\1\n/g'должно помочь.

0
18.03.2021, 23:18

Вместо того, чтобы просто форматировать тег Data, вы можете отформатировать весь файл XML с новыми строками после каждого узла XML. Это правильное решение.

Использование не элегантно, не универсально и не является правильным решением.

Подумайте о разделеCDATAвнутри вашего XML с помощью:

<![CDATA[foobar</Data>qux]]>

Вместо этого можно использовать синтаксический анализатор XML, например xmlstarlet:

xmlstarlet format -R file.xml

Пример:

cat file.xml
<foo>
<a>jkj</a><data>fghj</data><x>w</x>
</foo>

$ xmlstarlet fo -R file
<?xml version="1.0"?>
<foo>
  <a>jkj</a>
  <data>fghj</data>
  <x>w</x>
</foo>
0
18.03.2021, 23:18
sed 's:</Data>:&\
:g'

Или при вызове sed из bash или другой оболочки, поддерживающей $'\<char>', для расширения управляющей последовательности:

sed 's:</Data>:&\'$'\n'':g'

Или с GNUsed:

sed 's:</Data>:&\n:g'

напр.:

$ printf 'foo</Data>bar</Data>etc\n'
foo</Data>bar</Data>etc
$
$ printf 'foo</Data>bar</Data>etc\n' | sed 's:</Data>:&\n:g'
foo</Data>
bar</Data>
etc
1
18.03.2021, 23:18

Пробовал на питоне

cat inputfile

san</Data>abhi</Data>san

Питон

#!/usr/bin/python
g="</Data>"
import re
k=open('k.txt','r')
for i in k:
    m="{0}".format(g+"\n")
    q=re.sub(g,"{0}",i).format(m)
    print q

выход

san</Data>
abhi</Data>
san
0
18.03.2021, 23:18

Теги

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