Назад | Перейти на главную страницу

не жадная команда grep на ubuntu?

Я создаю сценарий, который отфильтровывает все наши переводимые файлы из нашей системы шаблонов. проблема, с которой я сталкиваюсь, - это случай, когда 2 переводимых файла находятся на одной строке.

Это 2 примера строк из файла шаблона, которые содержат одну или несколько переводимых

<img src="/captcha/generate.jpg" alt="[#Captcha#]" />
<span>[#Velden met een * zijn verplicht in te vullen#]</span> <button type="submit" name="frm_submit" class="right">[#Verzend#]

И когда я отключу следующее регулярное выражение

egrep "\[#(.*)#\]" . -Rohis

Я получаю этот вывод

[#Captcha#]"
[#Velden met een * zijn verplicht in te vullen#]</span> <button type="submit" name="frm_submit" class="right">[#Verzend#]

Пока желаемый результат

[#Captcha#]
[#Velden met een * zijn verplicht in te vullen#]
[#Verzend#]

Попытка разобрать HTML с помощью регулярных выражений приводит к боли, просто не делайте этого. Джефф писал об этом в Разбор HTML The Cthulhu Way. «Но я хочу только ______», неважно, серьезно, не делай этого. Потратьте немного времени и узнайте что-нибудь, предназначенное для синтаксического анализа html.

Я лично порекомендовал бы для этого модуль Perl (например, HTML :: TreeBuilder), а какие языки вы знаете? Другие варианты: tidy + xmlstarlet xmlgawk xpath xml2.

Если вам просто нужен "визуализированный" html в тексте, вы можете использовать что-то вроде ссылок: links -dump www.google.com

Прикомандированный комментарий Кайла.

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

egrep "\[#([^]]*)#\]" ...

Этот шаблон не будет работать, если у вас есть закрытие] внутри текста, например [#xyz] #] не будет совпадать.

Согласен с Кайлом. Однако в этом случае вы можете сделать это: egrep "\[#([^]])*)#\]" . -Rohis и получите то, что ищете.

В [^]]* соответствует не-] персонажей, поэтому остановимся на первом ] это бьет.

Используйте Perl, который позволяет выполнять нежадные совпадения. Для вашего случая, когда вы смотрите несколько матчей, сделайте это, как с модификатором / g. Мы добавляем переключатель -l, потому что нам нужно обрабатывать перевод строки самостоятельно:

perl -lne'while(/\[#(.*?)#\]/g) {print $&}' filename