Próbuję dopasować dowolną z następujących możliwości wzorców w tekście:

(X)
( X )
(  X  )
(x)
( x )
(  x  )

Gdzie "X" może być dowolnym pojedynczym znakiem alfanumerycznym (w tym "*. +"), Otoczony dowolną ilością przestrzeni lub w ogóle nie.

Oto, co osiągnąłem do tej pory:

export A=$(cat <<'EOL'
subject     Re: [ATPC] Teste de eMailForm
> - - - - - - - -
> 1 ) QUEM SOU EU?
> (  ) Sou cervejeiro profissional
> ( X ) Sou um bebum nato, não ligo pra marca
> (  ) Sou exigente, bebo apenas artesanais
> - - - - - - - -
EOL
)

echo "$A" | grep -E "\( * \)"
#echo "$A" | grep -E "\(*^[[:space:]]*\)"

I powraca:

> (  ) Sou cervejeiro profissional
> (  ) Sou exigente, bebo apenas artesanais

Dużo dziękuję za jakąkolwiek pomoc.

Edytuj: Spodziewam się, że zdobędę tę linię z mojego przykładu:

> ( X ) Sou um bebum nato, não ligo pra marca

1
Roger 17 luty 2017, 13:26

2 odpowiedzi

Najlepsza odpowiedź

Jeśli chcesz dopasować 1 lub więcej alfanumerycznych lub *, ., + symbole wewnątrz (...), możesz użyć

grep -E "\( *[a-zA-Z0-9*.+]+ *\)"

Jeśli istnieje jedynie pojedynczy znak inny niż spacje wewnątrz nawiasów, usuń + po ]:

grep -E "\( *[a-zA-Z0-9*.+] *\)"

Szczegóły :

  • \( - pasuje do dosłownego {x1}} (od -E umożliwiło rozszerzone tryb wyrażenia regularnego, a ( należy unikać w nim, aby dopasować się do dosłownego {x4}})
  • * - pomieszczenia 0+ (można wymienić za pomocą [[:space:]]*, aby dopasować dowolne białe znaki)
  • [a-zA-Z0-9*.+] - 1 znak, który jest literą ASCII, cyfrą, {x1}}, . lub + (jeśli oczekuje się 1 lub więcej zdarzeń, dodaj + ])
  • * - Zobacz powyżej
  • \) - Literal {x1}}.
1
Wiktor Stribiżew 17 luty 2017, 11:02

Użyj grep za pomocą wyrażeń regularnych PERL:

echo "$A" | grep -P '\(\s*\S+\s*\)'
3
Juan Diego Godoy Robles 17 luty 2017, 10:59