замена _ на - на sed, но только внутри атрибута href - PullRequest
1 голос
/ 07 февраля 2011

Я хотел бы заменить в текстовых фрагментах вроде:

<strong>Media Event &quot;New Treatment Options on November 4&ndash;5, 2010, in Paris, France<br /></strong><a href="/news/electronic_press_kits/company_media_event_trap_eye.php">&gt;&gt; more</a>  

все подчеркивания с тире. Но только в атрибуте href. Поскольку существуют сотни файлов, лучший подход - работать с этими файлами с помощью sed или небольшого шеллскрипта.

Я начал с

\shref=\"([^_].+?)([_].+?)\" 

но это соответствует только 1 _, и я не знаю количество _, и я подумал, как динамически можно заменить подчеркивание в неизвестном количестве обратных ссылок.

Ответы [ 2 ]

1 голос
/ 07 февраля 2011

Инструмент, специально предназначенный для работы с HTML, гораздо предпочтительнее, поскольку попытка работать с ним с помощью регулярных выражений может привести к безумию .

Однако, предполагая, что в каждой строке есть только один href, вы можете использовать эту методику «разделяй и властвуй»:

sed 's/\(.*href="\)\([^"]*\)\(".*\)/\1\n\2\n\3/;:a;s/\(\n.*\)_\(.*\n\)/\1-\2/;ta;s/\n//g' inputfile

Пояснение:

  • s/\(.*href="\)\([^"]*\)\(".*\)/\1\n\2\n\3/ - ставить новые строки вокруг содержимого href
  • :a;s/\(\n[^\n]*\)_\([^\n]*\n\)/\1-\2/;ta - заменить подчеркивание один за другим в тексте между символами новой строки, t ответвляется до метки :a, если была сделана замена
  • s/\n//g - удалить новые строки, добавленные на первом шаге
1 голос
/ 07 февраля 2011

Регулярные выражения просто не подходят для этой работы. Слишком много контекста, который должен соответствовать.

Вместо этого вам нужно написать что-то, что идет посимвольно, с двумя режимами: один, в котором он просто копирует все вводимые данные, и один, в котором он заменяет подчеркивание тире. При нахождении начала href он переходит во второй режим, а при выходе из href он возвращается к первому. По сути, это ограниченная форма токенизатора.

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