Регулярное выражение для сопоставления строки после последнего пробела и перед квадратной скобкой - PullRequest
0 голосов
/ 27 апреля 2018

У меня есть текст, следующий за шаблоном ниже:

Некоторый текст со многими пробелами [текст внутри квадратных скобок].

Мне нужно регулярное выражение, которое соответствует слову после последнего пробела и перед открывающей квадратной скобкой. В этом примере это будут «пробелы».

Попробовав это регулярное выражение . * \ S (. *) \ [ на этом онлайн-тестере , я попробовал использовать встроенный Perl

$ cat file-containing-pattern.txt | perl -ne "print $1 if s/.*\s(.*)(\[)/\1/"

но он печатает:

Сплошной текст в квадратных скобках].

Есть идеи, как это решить?

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018

Вы получаете совпадение и заменить в замешательстве. Матч правильный, и вы отвечаете с первой группой захвата. тем не менее, вы не заменяете текст после и включая группу 2 "([)".

вы хотите сопоставить и напечатать

cat file-containing-pattern.txt | perl -ne 'm/.*\s(.*)\[/ and print $1;'

или вы можете заменить все, кроме совпадения

 cat file-containing-pattern.txt | perl -pe 's/.*\s(.*)\[.*/$1/;'
0 голосов
/ 27 апреля 2018

Четыре номера:

  • Вы неверно цитируете команду, вызывая интерполяцию оболочки $1.
  • Вы используете \1 вне регулярного выражения, что не имеет смысла.
  • Вы используете подстановку, когда нет смысла это делать.
  • Вы полагаетесь на внутренние компоненты Perl, чтобы найти правильное соответствие, а не на точный шаблон.

Fix:

perl -nle'print $1 if / \s ( [^\s\[]+ ) \[ /x' file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...