perl + умная команда perl в одну строку, вместо grep для поиска необычных символов + полное совпадение - PullRequest
0 голосов
/ 17 ноября 2010

Тема: однострочная умная команда perl вместо простого grep (в bash-скрипте)

У меня проблема, когда я использую grep для сопоставления с необычными символами (я не могу ставить «\» перед каждым необычнымсимвол, потому что это очень проблематичное и не умное решение

Мне нужен perl-однострочный синтаксис, который точно соответствует всем неиспользуемым символам, как определено в примерах $ Some_string 

 Examples


 Some_string="[234-094]"
 Some_string="[ * ( & % @ !]"
 Some_string="~ [ 0:3 # % & ^ + =]"
 Some_string="1.1.1.1.-9.9.9.9   + 9999.999.1 – 10000"
 Some_string="< { [ ' : ; " ? / . , "
 Some_string="PORT.A.B.C.D – 124.543.455.33 – [ ! NOT EQUAL PORT 38737 – 3837652"
 .
 .
 .

мой плохой синтаксис grep

 cat  file | grep $Some_string

с perl (необходимо следующее правильное предложение / решение)

 cat file | perl -nle 'print if /$Some_string/'

ПРАВИЛА:

примечание: если Some_string = "111.111.111.111" и вУ меня есть файл 1111.1111.1111.1111, тогда синтаксис perl должен игнорировать это. Perl должен совпадать, только если у меня есть в файле: 111.111.111.111.

примечание sec: if Some_string = "WORD" и в файле, который у меня есть: ONEWORD, тогда синтаксис perl нужно игнорировать, этот perl должен совпадать, только если у меня есть в файле: WORD

Ответы [ 3 ]

2 голосов
/ 17 ноября 2010

Я не уверен, что точно понимаю ваш вопрос.Возможно, -P и -x делают то, что вы хотите, вместе с кавычками "$Some_string" для сохранения пробелов?

grep -Px "$Some_string" file

Со страницы руководства grep:

-P, --perl-regexp

Интерпретировать PATTERN как регулярное выражение Perl.

-x, --line-regexp

Выбирать только те совпадения, которые точно соответствуют всей строке.

0 голосов
/ 18 ноября 2010

Вы можете сделать что-то вроде этого:

perl -nE'say if m|\Q[ * ( & % \E\@\Q !]\E|' file

Я нашел здесь оператор \ Q и \ E: http://perldoc.perl.org/perlop.html#Quote-and-Quote-like-Operators

фрагмент этой ссылки:

Вы не можете включать литерал $ или @ в последовательность \ Q.Неэкранированный $ или @ интерполирует соответствующую переменную, а экранирование приведет к вставке литеральной строки \ $.Вам нужно написать что-то вроде m / \ Quser \ E \ @ \ Qhost /.

0 голосов
/ 17 ноября 2010

Вам придется как-то избежать строки. В этом случае требуется использование \ для экранирования специальных символов, поскольку передача строки в perl на самом деле ничем не отличается от передачи ее в grep - оба увидят строку после того, как оболочка обработает ее.

Использование perl для этого просто запутает ваш код.

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