*
em expressões regulares significa 0 ou mais do átomo anterior . Você está confundindo-o com o operador de curinga *
, onde significa 0 ou mais caracteres .
OPENSSL_NO_*
significa OPENSSL_NO
seguido por 0 ou mais sublinhados.
Você deseja:
grep -o 'OPENSSL_NO_.*'
Em que .
é o operador regexp para corresponder a um único caractere.
Ou:
grep -o 'OPENSSL_NO_[[:alnum:]]*'
para 0 ou mais caracteres alfanuméricos (em qualquer script alfabético suportado pela localidade).
As expressões regulares estendidas (como em grep -E
) também têm +
para 1 ou mais do átomo anterior . Com as expressões regulares Basic (sem -E), você pode usar \{1,\}
.
Algumas implementações de grep
também têm \w
, o que significa qualquer caractere alfanumérico ou sublinhado , embora note que em algumas versões de algumas implementações, é limitado a A-Za-z0-9
one.
Em qualquer caso, observe que -o
/ -R
não são opções padrão. POSIXly, você pode querer:
sed -n 's/.*\(OPENSSL_NO_[[:alnum:]_]\{1,\}\).*//p' < file
(permitindo apenas uma ocorrência por linha; se houver mais de um, apenas o mais à direita será exibido).
Isso não imprime os nomes dos arquivos. Para isso, você poderia usar awk
:
find . -name '*.[hc]' -type f -exec awk 'match($0, /OPENSSL_NO_[[:alnum:]_]+/) {
print FILENAME": "substr($0, RSTART, RLENGTH)}' {} +