Как найти и заменить эту строку на sed? - PullRequest
0 голосов
/ 13 марта 2012

Я отчаянно пытаюсь найти следующее:

<texit info> author=MySelf title=MyTitle </texit>

и заменить его на пустое.

До сих пор я пробовал следующее:

sed –I '1,5s/<texit//;s/info>//;s/author=MySelf//;s/title=MyTitle//' test.txt

Но это не работает.

Ответы [ 2 ]

2 голосов
/ 13 марта 2012
sed 's/<texit\s\+info>\s*author=MySelf\s\+title=MyTitle\s*<\/texit>//g' test.txt

Как правило, не следует редактировать XML с помощью регулярного выражения, но если вы хотите удалить только эти теги, сработает вышеприведенное. Вам не нужно несколько s команд, просто используйте один шаблон с правильно определенным пробелом.

2 голосов
/ 13 марта 2012

Не редактируйте 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> и любой лишний текст, как вы и просили.Если вы ожидаете или хотите сделать что-то другое, вам следует объяснить, что это такое.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...