Perl: соответствие шаблону regx

#regex #perl

#регулярное выражение #perl

Вопрос:

Всякий раз, когда я нахожу слово «.abc.corp:» в строке файла, я хотел бы исключить эти строки:

Пример строки:

 kubernte-fileserver-NN.abc.corp:/srv/export/storage/nsp_updates   1231231  123112  123123  89%  /devops
  

может ли кто-нибудь помочь мне найти правильный шаблон регулярных выражений:

я пытаюсь использовать приведенное ниже соответствие шаблону: не могу понять это

 /^(.*(?!.abc.corp).*)s (d )s (d )s (d )s (d )%s ([/wd.-] )$/
  

Меня смущает группа подшаблонов $ 1 с негативным взглядом вокруг!

Комментарии:

1. Почему вы пытаетесь втиснуть все в одно регулярное выражение?

Ответ №1:

«исключить это», я предполагаю, что вы хотите исключить всю строку.

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

 kubernte-fileserver-N
N.abc.corp:/srv/export/storage/nsp_updates
  

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

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

 if (/^S .abc.corp:/) {
    # SKIP
}
elsif (/^(.*)s (d )s (d )s (d )s (d )%s ([/wd.-] )$/) {
    ...
}
  

Помимо того, что это действительно работает, это делает код намного более читаемым.