Em um ambiente UNIX (BSD), gostaria de capturar uma substring específica usando uma expressão regular.
Suponha que a dmesg
saída do comando inclua a seguinte linha:
pass2: <Marvell Console 1.01> Removable Processor SCSI device
Eu gostaria de capturar o texto entre os caracteres <
e >
, como
dmesg | <sed command>
deve emitir:
Marvell Console 1.01
No entanto, ele não deve produzir nada se o regex não corresponder. Muitas soluções, inclusive sed -e 's/$regex/\1/
, produzirão toda a entrada se nenhuma correspondência for encontrada, o que não é o que eu quero.
A regexp correspondente pode ser:
regex="^pass2\: \<(.*)\>"
Como eu faria corretamente uma correspondência de regex usando sed
ou grep
? Observe que a grep -P
opção não está disponível na minha distribuição BSD UNIX. A sed -E
opção está disponível, no entanto.
Tente isso,
Ou POSIXly (
-E
ainda não chegou ao padrão POSIX a partir de 2019):Resultado:
Isso imprimirá apenas a última ocorrência de
<...>
para cada linha.Que
-o
tal no grep apenas imprimir a parte correspondente? Ainda precisamos remover o<>
, mastr
funciona lá.Eu tentei abaixo de 3 métodos usando sed, awk e python
comando sed
resultado
comando awk
resultado
Pitão
resultado
Você pode extrair a substring com
grep -o -e
o comando abaixo:Por algum motivo,
*
funciona em vez de+
1 ou muitas correspondências neste comando grep regex match.Leia o manual do grep com o seguinte comando:
Leia sobre as opções
-o
e-e
.Eu uso isso no trabalho para extrair toneladas de dados de várias linhas de log.