O comando grep
imprimirá uma linha quando a linha contiver uma string que corresponda a uma expressão, o que não é útil para pesquisar conteúdo específico.
Por exemplo, tenho arquivos de vocabulário com formatação
**word**
1. Definition:
2. Usage
3. Others
Gostaria de recuperar todas as palavras para fazer uma lista de palavras dentro dos arquivos
grep '\*\*[^*]*\*\*'
Retorna a maior parte do conteúdo.
Como usar grep
para pegar apenas o word
?
Responder1
Assim por palavra, usandoperlregex( -P
):
grep -oP '^\s*\*\*\K[^*]+(?=\*\*)' file
Saída :
word
Assim para palavras:
grep -oP '^\s*\d+\.\s*\K\w+' file
Saída :
Definition
Usage
Others
Responder2
Existem diversas ferramentas disponíveis que podem ser utilizadas para extrair word, aqui está uma versão implementada em sed:
sed '/^\*\*/!d' <your_file
Este comando irá corresponder a cada linha do seu arquivo que começa com **
e imprimi-lo. As outras linhas serão excluídas da saída. Se você também deseja remover as estrelas, você pode estender o comando para isto:
sed '/^\*\*/!d;s/\*//g' <your_file
Além disso, este comando removerá todos *
os caracteres da linha antes de ela ser impressa.
Responder3
Com awk
jeito:
awk -F'*\\*' 'NF>2{print $2}' infile
entrada de teste de amostra:
*wrd*
*woooord
**WRD
WORD**
woooooooooood*
**word**
a saída:
word
Responder4
Se você não se importa em usar ferramentas adicionais, uma solução muito simples seria pós-filtrar a grep
saída para tr
excluir todas as ocorrências do caractere *
:
grep -x '\*\*[^*]*\*\*' | tr -d '*'
Eu também recomendo que você use o -x
sinalizador do GNU grep como acima para combinar apenas linhas inteiras para não **word**
aparecer acidentalmente cercado por outro texto na mesma linha. Isto também pode acelerar o processo de correspondência de padrões, uma vez que agora pode descartar muitas correspondências potenciais antecipadamente.
sed
alternativa
Você também pode aproveitar o p
sinalizador do sed para combinar, substituir e imprimir como um único comando:
sed -nre 's/^\*\*([^*]*)\*\*$/\1/p'