Я пытаюсь сделать некоторые манипуляции с файлом формата XMLTV, который содержит информацию о расписании ТВ. В файле есть разделы, которые выглядят так:Есть ли утилита командной строки Linux для удаления разделов (не уверен, что это правильный термин) из XML-файла?
<programme start="20141215220000 -0500" stop="20141216060000 -0500" channel="someid.someaddress.com">
<title lang="en">Local Programming</title>
<length units="hours">1</length>
<episode-num system="common">S00E00</episode-num>
<episode-num system="dd_progid">SH00019112.0000</episode-num>
<previously-shown />
</programme>
Как вы можете видеть во второй строке этого:
<title lang="en">Local Programming</title>
То, что я хотел бы найти это своего рода утилита командной строки, которая работает в Linux, который может искать эту конкретную строку и, если она существует, удаляет все между тегами программы и включая их. Я не очень хорошо знаком с XML-файлами, поэтому я не знаю, есть ли конкретное имя для такого блока данных, но я просто хочу удалить весь этот раздел, когда заголовок называется «Local Programming».
Это могло бы работать лучше для моих целей, если бы я мог удалить блок только тогда, когда заголовок «Местное программирование», а значение канала в первой строке является определенным конкретным значением, так как мне нужно только удалить их для но не повредило бы что-либо, чтобы удалить все блоки «Local Programming» на любом канале, и искать два значения, вероятно, сделало бы это гораздо более сложной задачей. Это должна быть утилита командной строки, потому что она будет вызвана из короткого сценария оболочки.
В основном я просто пытаюсь определить лучший инструмент для работы. Я не программист (если только вы не считаете, что сценарий оболочки bash имеет несколько строк, который просто выполняет несколько операций последовательно, как программирование), поэтому, если возможно, я хотел бы использовать существующий инструмент командной строки, но я не неблагоприятное для того, чтобы вытащить что-то новое с помощью apt-get. Какие-либо предложения?
EDIT: Работал был инструмент xmlstarlet, предложенный Чарльзом Даффи, но только если я не пытался использовать параметр -var и вместо этого указывал значения напрямую. Например, это убрали все блоки с заголовком «Local Programming» из файла xmltv.xml:
xmlstarlet ed --delete "//programme[title='Local Programming']" <xmltv.xml >newfile.xml
И если я хочу, чтобы удалить блок только тогда, когда название «Местное программирование» и значение канала в первая строка представляет собой определенное конкретное значение, то оказывается, что это работает:
xmlstarlet ed --delete "//programme[title='Local Programming'][@channel='someid.someaddress.com']" <xmltv.xml >newfile.xml
Это именно то, что я искал, поэтому я считаю, что проблема решена. Спасибо всем, кто ответил.
Это довольно просто, но ваша спецификация о том, как решить, что поражает меня как менее ясное, чем идеальное. Вы хотите удалить любой заголовок, независимо от его языка? Только на английском языке? Только внутри одной программы? Внутри любой программы? Попробуйте указать свою проблему однозначно с минимальным излишним текстом. –
Charles Duffy: Я не уверен, как бы я мог сделать это менее двусмысленным, но здесь идет: я хочу удалить каждый «программный» блок, который содержит определенную строку «
Итак - версия, которую я дал удаленным программам, где _any_ title - «Local Programming»; основанный на пояснении, похоже, что вы хотите удалить программы, в которых заголовок _English_ является «Local Programming». Я поправлю свой ответ соответствующим образом. –