Не редактируйте XML с помощью sed - правильный инструмент будет выглядеть примерно так: XMLStarlet со строкой, подобной следующей:
xmlstarlet ed -u //texit[@info] -v 'author=NewAuthor title=NewTitle'
... если бы ваша цель былаобновить текст внутри тега.
Регулярные выражения недостаточно выразительны, чтобы правильно обрабатывать XML (даже формально - регулярные выражения теоретически достаточны для анализа регулярных языков; XML не один).Например, ваш оригинал будет так же корректно написан с новыми строками, как:
< texit
info >author=MySelf title=MyTitle</texit>
... и написание команды sed для обработки этого случая не будет забавным.Нативные инструменты XML, с другой стороны, могут правильно обрабатывать все угловые случаи XML.
Тем не менее, выражение sed, которое вы дали, действительно «работает», поскольку оно выполняет именно то, для чего оно написано.
sed -e '1,5s/<texit//;s/info>//;s/author=MySelf//;s/title=MyTitle//' \
<<<"<texit info>author=MySelf title=MyTitle foo bar</texit>"
возвращает вывод
foo bar</texit>
, который именно то, что должен сделать, поскольку он удаляет строку <texit
, строку info>
,author=MySelf
, title=MyTitle
, но оставляя закрывающий </texit>
и любой лишний текст, как вы и просили.Если вы ожидаете или хотите сделать что-то другое, вам следует объяснить, что это такое.