Bash: Mostra o conteúdo de um arquivo de texto, com todas as ocorrências de uma palavra destacada [duplicado]

1

Como posso mostrar o conteúdo de um arquivo de texto, com cada ocorrência de uma palavra destacada?

    
por Leo Rogers 26.01.2017 / 15:50

2 respostas

3

grep -C $(wc -l foo.txt | cut -d" " -f 1) --color word foo.txt

Em que foo.txt é o caminho do arquivo e word é o termo de pesquisa. Se você não estiver familiarizado com grep , tenha cuidado, o termo de pesquisa é, na verdade, uma expressão regular . Isso não importa se word é puramente alfanumérico, mas certos caracteres como [ e ] têm um significado especial em uma expressão regular e, se você quiser usá-los literalmente, prefixar \ . Além disso, isso passa pelo shell, portanto, $ fará coisas engraçadas se não tiver também escapado com \ .

Você pode incluir espaços em word se você colocar entre aspas.

Os outros comandos usados aqui são wc e cut , que quase sempre estarão em estoque em um sistema POSIX como o GNU / Linux. Eles têm man páginas que explicam seu uso.

    
por 26.01.2017 / 16:02
3

Você pode fazer isso com apenas grep . Onde file.txt é seu arquivo e word é o texto que você quer destacar, você pode usar:

grep --color -E 'word|$' file.txt

Isso corresponde e destaca as ocorrências de word . Além disso, ele alternativamente ( | ) corresponde e destaca a string vazia no final de cada linha ( $ ). Mas como essa string está vazia, nenhum texto extra é realçado.

A combinação de $ , além de word , serve para garantir que cada linha contenha uma correspondência. Em seguida, grep imprime todas as linhas, mesmo sem as opções -A , -B ou -C ou quaisquer chamadas para outros utilitários.

O sinal -E faz com que grep interprete seu argumento padrão como uma expressão regular estendida POSIX (ERE ). Dependendo de quais caracteres estão em word , você pode querer usar uma expressão regular básica (BRE). Embora a alternância com | não seja oficialmente parte das expressões regulares básicas POSIX, grep implementations geralmente a suportam como uma extensão com \| : 1

grep --color 'word\|$' file.txt

Em particular, nos sistemas GNU / Linux você tem o GNU Grep, que suporta isso. Se você estiver confiando em --color , provavelmente poderá confiar nesse comportamento também.

Esses comandos são mais simples do que o modo na resposta de goldilocks . Mas a técnica nessa resposta tem uma vantagem distinta em algumas circunstâncias. Como os métodos aqui usam | e $ , eles precisam ser realmente expressões regulares, em vez de seqüências de caracteres fixas. No entanto, com o método goldilocks , você pode adicionar o sinalizador -F . Então, word pode conter qualquer texto que você goste, mesmo \ , desde que você cite word corretamente para garantir que o shell o transmita para grep unmodified.

Por exemplo, você pode usar:

grep --color -FC "$(wc -l < file.txt)" 'word' file.txt

Para ler mais, consulte Convença o grep a produzir todas as linhas, não apenas aquelas com correspondências (como steeldriver sugerido ).

1 Em relação ao padrão (IEEE Std 1003.1-2008) especifica que a alternação é um recurso do ERE (via | ), mas não é um um recurso do BRE. Mas as implementações são permitidas para interpretar \| como desejarem, e muitas interpretam como alternância:

Some implementations have extended the BRE syntax to add alternation. For example, the subexpression "\(foo$\|bar\)" would match either "foo" at the end of the string or "bar" anywhere. The extension is triggered by the use of the undefined "\|" sequence.

    
por 26.01.2017 / 19:33

Tags