grep -E с несколькими метасимволами - PullRequest
3 голосов
/ 24 июня 2019

Я борюсь с определенным регулярным выражением, которое мне нужно передать в grep -E

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

  • слово начинается с начала строки ИЛИ начинается с пробела или любого из следующих символов "'` (,:; <[{| ~ </p>

  • слово оканчивается на "'),:;>]`} | ~ или пробел, ИЛИ в конце строки.

####should be matched#### ignore the red text#########3
suvoo:
:suvoo:
 suvoo 
 suvoo:
suvoo'
suvoo`
`suvoo`
"suvoo"
'suvoo:
 'suvoo "ghj
'suvoo
[suvoo~
{suvoo'
his name was `suvoo'
his name is suvoo and he is 25
####shouldnt be matched####
asddsuvooaed
:suvo@abc:
suvooo
1suvoo
suvoo1:

Я не уверен, почему моя команда ничего не соответствует, возможно, я неправильно понял, что нужно экранировать и т. Д.

grep -Einr "(^|[[:space:][\"'(,:;<[\`{|~]])suvoo([[:space:][]\"'),:;>\`}|~]]|$)" .

1 Ответ

3 голосов
/ 24 июня 2019

Вы должны написать это как

grep -E '(^|[[:space:]"'"'"'`(,:;<[{|~])suvoo([][:space:]"'"'"'),:;>`}|~]|$)'

См. онлайн демо

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

Детали

  • [[:space:]"'"'"'`(,:;<[{|~] - переводится в [[:space:]"'`(,:;<[{|~] и соответствует пробелу, ", ', `, (, ,, :, ;, <, [, {, | или ~.
  • [][:space:]"'"'"'),:;>`}|~] переводится в [][:space:]"'),:;>`}|~] и соответствует ], пробелу, ", ', ), ,, :, ;, >, ` , }, | или ~.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...