У меня есть файл, в который нужно поместить содержимое тегов. Например:
<Model500>
ABC
BCD
CDE
</Model500>
<Model500>
123
234
345
</Model500>
Я хотел бы извлечь содержимое в
<Model500>
</Model500>
, используя sed
. Это будет выглядеть так, как
ABC
BCD
CDE
123
234
345
Я попытался это сделать, используя
sed -e 's/<Model>\,/</Model>/p' file.txt
Но специальные символы вызывают проблемы. Любой совет? Спасибо.
Если вводится XML, то лучше всего использовать специальный инструмент XML.
Одним из способов включения /
в регулярное выражение sed является экранирование его обратной косой чертой:
$ sed -ne '/<Model500>/,/<\/Model500>/p' file.txt
<Model500>
ABC
BCD
CDE
</Model500>
<Model500>
123
234
345
</Model500>
Выражение /
определяет диапазон строк. Диапазон начинается со строки, соответствующей
, и заканчивается строкой, соответствующей <\ / Model500>
. Поскольку мы указываем диапазон, а не заменяющую команду, выражение не начинается с s
.
Если вы не хотите его экранировать, вы можете использовать другой разделитель:
$ sed -ne '\|<Model500>|,\|</Model500>|p' file.txt
<Model500>
ABC
BCD
CDE
</Model500>
<Model500>
123
234
345
</Model500>
Здесь мы использовали |
в качестве разделителя. Чтобы сигнализировать, что в диапазоне используется разделитель, отличный от /
, следует экранировать первый разделитель: \ |
.
Поскольку строка
содержит символ /
, вам нужно либо экранировать его в выражении sed, либо использовать другой символ для ограничения выражения sed. К счастью, sed может использовать любой одиночный символ для ограничения выражения, поэтому вам просто нужно выбрать тот, который не появляется во входных данных.
В более общем плане sed, вероятно, не лучший выбор для данной задачи. Похоже, что вы анализируете XML-файл, поэтому вам, вероятно, следует использовать библиотеку, созданную для анализа XML, а не взламывать что-то вместе с sed. См. этот пост , чтобы узнать, почему это плохая идея.