Extraia um elemento das linhas de um arquivo de texto

Extraia um elemento das linhas de um arquivo de texto

O comando grepimprimirá 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 greppara pegar apenas o word?

Responder1

Assim por palavra, usandoregex( -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 awkjeito:

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 grepsaída para trexcluir todas as ocorrências do caractere *:

grep -x '\*\*[^*]*\*\*' | tr -d '*'

Eu também recomendo que você use o -xsinalizador 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.

sedalternativa

Você também pode aproveitar o psinalizador do sed para combinar, substituir e imprimir como um único comando:

sed -nre 's/^\*\*([^*]*)\*\*$/\1/p'

informação relacionada