Другие дали хорошие ответы о том, почему вы должны использовать правильный синтаксический анализатор XML, если вы хотите обойти синтаксический анализ XML, но в качестве объяснения того, как сделать это в sed, на случай, если вы столкнетесь с подобной проблемой: 1001 *
#Full Command
sed -n 's/^[^<]*<tspan[^>]*>\([^<]*\)<.*/\1/p' ~/your_file.xml
Параметр n запрещает отправке sed никаких выходных данных, если об этом не попросили Обычно sed повторяет пробел в конце, что может сбить с толку
Начиная с s, так как [s] заменял. Знак "/", который следует, говорит sed, что мы будем использовать "/" для разделения различных частей скрипта.
Возьмите все с начала строки (^) вместе со всем, что после этого не является открытой скобкой ([^ `<] *). Это будет отброшено позже. </p>
Возьмите tspan и все, что после него, которое не является закрывающей скобкой ([^>] *>). Это также будет отброшено.
Возьмите все после этой закрывающей скобки, это не открытая скобка. Это часть, которую мы хотим сохранить, поэтому мы заключаем ее в экранированные скобки. "([^ <] *)" </p>
Захватите все от последней закрывающей скобки до конца строки "<. *". Мы тоже это выбросим. </p>
Вторая часть команды: \ 1
Все это означает: повторите все, что было в первом наборе экранированных скобок, которые мы использовали ранее. Был только один набор скобок, поэтому \ 2, \ 3 и т. Д. Здесь не имеют смысла, но вы можете использовать их в других скриптах. В вашем случае вы хотите повторить то, что мы нашли внутри вашего
Наконец: «p» заставляет sed распечатывать спички. В начале это работает с -n, что означает «ничего не печатать», кроме «совпадений»
Надеюсь, это было полезно ...