регулярные выражения с grep

Я думаю самый простой способ обработать, это должно просто скопировать рубин-mode.el в марионетку-mode.el и сорвать все места, которые Вы видите, что он обрабатывает ensure особенно. В моем ruby-mode.el, это, кажется, только происходит в двух местах:

  1. Где слова блока определяются

    (defconst ruby-block-mid-keywords
      '("then" "else" "elsif" "when" "rescue" "ensure")
      "Keywords where the indentation gets shallower in middle of block statements.")
    
  2. Где зарезервированные слова определяются:

    (defconst ruby-font-lock-keywords
    ...
                 "ensure"
    

Я поставил удаление ensure от тех двух мест, сохраняя как puppet-mode.el и затем изменение Ваш .emacs к этому добился бы цели:

(autoload 'puppet-mode "puppet-mode" "Major mode for editing Puppet config" t)
(setq auto-mode-alist  (cons '(".pp$" . puppet-mode) auto-mode-alist))
2
15.09.2013, 22:32
2 ответа

Проблема здесь - это . используется для выражения любого отдельного символа. Так . соответствовал бы 5 в 50 но, ни с чем для соответствия 0, остальной части строки не удается соответствовать. В любом случае, так как Вы знаете, что то, что Вы ищете, является любым числом, необходимо быть более конкретными с regex. Соответствуйте любому числу:

[0-9]\+

Если Вы знаете, что это число может иметь дополнительную дробную часть (после десятичной точки), можно использовать следующее:

[0-9]\+\(\.[0-9]\+\)?

Обратная косая черта перед + и parens должен быть опущен, если Вы используете grep -P Опция (PCRE).

Если Вы действительно планируете использовать -P опция, необходимо знать, что это не находится в стандарте POSIX и не может быть доступно на всех платформах.

4
27.01.2020, 21:57

Вы могли также использовать -P флаг, чтобы включить Perl совместимые регулярные выражения и использование \d:

grep -P -B10 -A10 '14:14:\d+ {"channels":["/alerts/6979/new"],"data":"New alerts for unit 6979"}' mygateway.log

Вы могли также действительно упростить его путем создания его менее строгим (детали зависят от входных данных, конечно, но это должно работать):

grep -P -B10 -A10 '14:14:\d+.*channels.*alerts/6979/new.*data.*New' mygateway.log

Я предполагаю это, если строка соответствует обоим /alerts/6979/new/ и New, остальное неизменно.

1
27.01.2020, 21:57
  • 1
    \d класс неожиданно известен за поведение в средах неASCII. [0-9] обычно, что предназначено. Я уверен, что Вы уже знаете это; это к вашему сведению для других читателей. –  Joseph R. 15.09.2013, 22:44
  • 2
    Read здесь под направляющимися "Цифрами". –  Joseph R. 15.09.2013, 22:47
  • 3
    @JosephR. Это могло бы относиться perl, но вероятно не к PCREs (которые не являются регулярными выражениями жемчуга), как используется в GNU grep -P. Даже echo '\u09EA' | LC_ALL=bn_BD.UTF-8 grep -P '(*UCP)\d' кажется, не соответствует, хотя это может быть до GNU libc или к моему фактическому бенгальскому определению –  Stéphane Chazelas 16.09.2013, 00:50
  • 4
    @StephaneChazelas локали спасибо за разъяснение и интересный пример. Можно ли объяснить (*UCP) часть, хотя? –  Joseph R. 16.09.2013, 00:57
  • 5
    @JosephR. Да, и поскольку я сказал, можно повернуть PCRE_UCP путем добавления (*UCP) в regexp, но даже затем я не вижу, что он соответствует цифрам неASCII в моей системе. –  Stéphane Chazelas 16.09.2013, 12:28

Теги

Похожие вопросы