Pular para o conteúdo principal

O incrível sed - stream editor

sed é um editor extremamente eficiente usado para realizar transformações de texto. Se você está precisando substituir uma palavra ou expressão, que ocorre várias vezes ao longo de um arquivo de texto, pode pensar em usar o comando "Localizar e Substituir" normalmente presente em qualquer programa para edição desses arquivos. Mas se o problema é que você tem datas no formato mm-dd-yyyy (mês-dia-ano) e precisa trocar para o formato dd/mm/yyyy (dia/mês/ano), a ferramenta de Localizar e Substituir não vai ajudar pois:
  1. São várias datas com dias, meses e anos variados;
  2. A ordem mês - dia mudará para dia - mês.
Essa tarefa que é praticamente impossível para os editores comuns, o sed faz isso com os "pés nas costas". Vamos conhecê-lo um pouco?

Seções


Que tal uma mãozinha!

Vejamos alguns exemplos de situações reais nas quais a gente fica bem feliz por ter o sed por perto para dar "uma mãozinha"!

1) Imagine que você tem um arquivo com várias citações do tipo 'silva, F. et al' e quer passar para o famoso padrão MLA ou para o formato ABNT usado em 2020. O problema, portanto, é o seguinte:

  • 'silva, F. et al'  →  Silva, F. et al (padrão MLA)
  • 'silva, F. et al'  → SILVA, F. et al (padrão ABNT)

Obs.: tente solucionar o problema apresentado por si só e depois comparar com a nossa sugestão, ok?

Corrigindo as referências

Passando para o padrão MLA:

$ echo 'silva, F. et al' | sed -E 's/(.*),/\u&/'

Passando para o padrão ABNT:

$ echo 'silva, F. et al' | sed -E 's/(.*),/\U&/'


2) Algumas vezes, consultamos um arquivo de configuração repleto de comentários e algumas linha em branco. Os comentários são úteis para quem for alterar o arquivo mas se você só deseja ver como as variáveis estão configuradas, os comentários dificultam a leitura.

A animação seguinte mostra um arquivo de configuração com essas características e, na sequência, o sed é usado para eliminar os comentários e as linhas em branco. Se você já conhece um pouco o sed, tente usá-lo para exibir o conteúdo do arquivo sem os comentários e sem linhas em branco.

2) Removendo os comentários (que iniciam com '#') e linhas em branco

$ cat /etc/adduser.conf | sed -e '/^$/d' -e '/^#/d'

3) Vejamos o exemplo dado na introdução: o arquivo "prod.csv" contém duas colunas, sendo que na primeira coluna temos datas no formato mês-dia-ano. Você deseja passar para o formato dia/mês/ano. Um simples comando sed pode realizar essa tarefa. A figura a seguir ilustra o seu arquivo de entrada:

Após uma mãozinha do sed, ficamos com os dados conforme desejado:

Corrigindo as datas

$ sed -E -f 's_([0-9]{2})-([0-9]{2})-(.*)_\2/\1/\3_' prod.csv

ou

$ sed -E 's_(..)-(..)-(.*)_\2/\1/\3_' prod.csv
Sintaxe

     A sintaxe do sed normalmente é:

     sed [opções] script arquivo-de-entrada

     script refere-se a uma ou mais instruções de processamento que podem ser inseridas diretamente na linha de comando ou podem estar contidas em um arquivo.

O texto de entrada normalmente encontra-se gravado no arquivo-de-entrada mas também pode ser enviado ao sed diretamente pelo teclado usando, por exemplo, os comandos echo ou seq.

Os colchetes usados para ilustrar a sintaxe indicam conteúdo opcional, ou seja, podemos chamar o sed sem nenhuma opção.

Como exemplo, podemos substituir a palavra 'planeta' por 'globo' no arquivo 'entrada.txt':

     sed 's/planeta/globo/' entrada.txt

     Nesse caso, o sed irá ler linha por linha do arquivo entrada.txt e sempre que encontrar uma ocorrência do padrão procurado, "planeta", fará a troca por "globo".

Como não foi informado nenhum arquivo de saída para o resultado do processamento pelo sed, o resultado será enviado para a saída padrão, ou seja, a tela, normalmente. Se quiséssemos enviar o resultado para um arquivo, bastaria usar o redirecionamento do Linux ('>'). As seguintes formas são equivalentes:

     sed 's/planeta/globo/' entrada.txt > saida.txt
     cat entrada.txt | sed 's/planeta/globo > saída.txt
     sed 's/planeta/globo/ < entrada.txt > saída.txt

Áreas de transferência

     O sed utiliza duas áreas para transferência de dados, que vamos chamar de espaço do padrão procurado (E1) e espaço de espera (E2). Normalmente somente E1 é utilizado mas em operações um pouco mais sofisticadas, como operações em múltiplas linhas do arquivo de entrada, pode-se recorrer ao E2. Mas deixemos o E2 para mais tarde, por enquanto.

Fluxo normal de funcionamento do sed 

  • lê uma linha da entrada
  • remove os caracteres de newline (NL) e guarda no E1
  • aplica o(s) comando(s) ao conteúdo de E1
  • envia E1 para a saída e adiciona a NL (se não tiver -n)

Regexp

        As expressões regulares, ou abreviadamente regexp (ou ainda regex, em alguns textos) são padrões para seleção de trechos em uma string ou sequência de caracteres. Por exemplo, um caractere alfanumérico qualquer , como 'a' ou '5' possuem seu significado ordinário, indicando que que se deseja procurar na string um 'a' ou '5'. 

Porém, um '*' não tem o seu significado ordinário do caractere asterisco, mas sim que se deseja procurar por zero ou mais repetições do caractere precedente. Pr exemplo, 'a*b' corresponde a sequências do tipo b, ab, aab, aaaaaaaaab, por exemplo.

O sed utiliza-se das regexp para procurar texto que possuam um certo padrão, como no comando de substituição, s/.../.../, e também para restringir as linhas processadas e assim agilizar seu processamento. Por exemplo,  podemos pedir ao sed para deletar todas as linhas de um arquivo que comecem com "#". Nesse caso, teríamos a regexp "^#" que significa "começar com com #" e somente as linhas com esse padrão seriam processadas e, portanto, deletadas.

Segue uma lista das expressões regulares aceitas pelo sed:

  • 'CHAR' um simples caractere
  • '*' 0 ou mais sequências do caractere precedente. Ex.: 'ab*' = a, ab, abb etc.
  • '.' qualquer caracter incluindo newline (NL)
  • '^' início da linha
  • '$' fim da linha
  • '[LISTA]' qualquer um dos caracteres da LISTA
  • '\+' 1 ou mais
  • '\?' 0 ou 1
  • '\{M\}' exatamente M ocorrências
  • '\{M,N\}' entre M e N, inclusive, ocorrências
  • '\{M,}' M ou mais ocorrências
  • '\(REGEXP\)' grupo
  • 'REGEXP1\|REGEXP2' um OU outro
  • 'REGEXP1REGEXP2' um E outro
  • '\N' o grupo N (N é inteiro)
  • '\n' o carectere de nova linha
  • '\CHAR' torna um dos caracteres especiais da lista "^ $ . * + \ [" um simples caractere

Classes de caracteres

  • Devem ser usadas entre colchetes []
  • '[:alnum:]' o mesmo que [0-9A-Za-z]
  • '[:alpha:]' o mesmo que [A-Za-z]
  • '[:blank:]' o mesmo que espaço ou TAB
  • '[:cntrl:]' caracteres de controle não alfanuméricos. DEL, por exemplo
  • '[:digit:]' o mesmo que [0-9]
  • '[:punct:]' caracteres de pontuação e outros como '! " # $ % & ' ( ) * + , - . / : ; < = > ? @ [ \ ] ^ _ ` { | } ~'
  • '[:graph:]' o mesmo que [:alnum:] e [:punct:]
  • '[:lower:]' o mesmo que [a-z]
  • '[:upper:]' o mesmo que [A-Z]
  • '[:space:]' caracteres como horizontal TAB, vertical TAB, espaço, newline, form feed, CR
  • '[:xdigit:]' dígitos hexadecimais, ou seja: [0-9A-Fa-f]
  • '[:print:]' é o mesmo que [:alnum:], [:punct] e espaço
  • exemplo:
    • $ echo '1a2b!c#d' | sed 's/[[:digit:][:punct:]]/X/g'
    • retorna: XaXbXcXd

Caracteres de escape

  • '\a' um caractere BEL, que é um "beep" ou apito (ASCII 7).
  • '\f' um form feed (ASCII 12).
  • '\n' um newline (ASCII 10).
  • '\r' um CR (ASCII 13).
  • '\t' um TAB horizontal (ASCII 9).
  • '\v' um TAB vertical (ASCII 11).
  • '\cX' corresponde a 'CONTROL-X', onde X é qualquer caractere.
  • '\dXXX' corresponde a um caractere cujo valor ASCII decimal é XXX.
  • '\oXXX' corresponde a um caractere cujo valor ASCII octal é XXX.
  • '\xXX' corresponde a um caractere cujo valor hexadecimal ASCII é XX.

Resumo dos comandos 'sed'

Apresentamos nesta seção um sumário dos comandos do sed. Esta lista serve como referência e para dar uma noção do poder do sed. O processo mais natural de aprendizado do sed é aprender sob demanda, ou seja, conforme a necessidade. Provavelmente o comando mais usado do sed é o comando de substituição. Esse e outros comandos mais usados serão abordados na seção "Praticando".

Os seguintes comandos são suportados no GNU 'sed'. Alguns são padrão POSIX, enquanto outros são extensões GNU. Quando oportuno, mnemônicos (baseados na língua inglesa) são mostrados entre parênteses.

'a\'
'TEXTO'
     Anexe TEXTO após uma linha.

'a TEXTO'
     Anexe TEXTO após uma linha (sintaxe alternativa).

'b RÓTULO'
     Desviar incondicionalmente para RÓTULO. O
RÓTULO pode ser omitido, caso em que o próximo ciclo é iniciado.

'c\'
'TEXTO'
     Substitua (
change) as linhas por TEXTO.

'c TEXTO'
     Substitua (
change) as linhas por TEXTO (sintaxe alternativa).

'd'
     Exclua (
delete) o espaço E1; inicia imediatamente o próximo ciclo.

'D'
     Se o espaço E1 contém newlines, exclua (
Delete) o texto no espaço E1 até o primeiro newline e reinicie o ciclo com o E1 resultante, sem ler uma nova linha de entrada.

     Se E1 não contém newline, inicie um novo ciclo normal como
     se o comando 'd' fosse chamado.

'e'
     Executa (
execute) o comando que é encontrado no espaço E1 e substitui E1 com a saída; o newline final é suprimido.

'e COMANDO'
     Executa (execute) COMANDO e envia sua saída para o fluxo de saída. o comando pode ser executado em várias linhas, todas exceto a última terminando com uma barra invertida.

'F'
     Imprime o nome do arquivo (
Filename) de entrada atual (com um newline final).

'g'
     Substitua o conteúdo do espaço E1 com o conteúdo do espaço E2.

'G'
     Anexe uma nova linha ao conteúdo do espaço E1 e, em seguida, acrescente o conteúdo do espaço E2 ao do espaço E1.

'h'
     Substitua o conteúdo do espaço de espera (
hold) E2 pelo conteúdo de E1.

'H'
     Anexe uma nova linha ao conteúdo do espaço de espera (
Hold) E2 e, em seguida, anexe o conteúdo do espaço E1 para aquele do espaço E2.

'i\'
'TEXTO'
     insira TEXTO antes de uma linha.

'i TEXTO'
     insira TEXTO antes de uma linha (sintaxe alternativa).

'l'
     Imprima o espaço E1 de uma forma inequívoca (substituindo os caracteres de controle como \n e $ por caracteres simples).

'n'
     Se a impressão automática não estiver desabilitada, imprima o espaço E1 e, a seguir, substitua o espaço do padrão pela próxima (next) linha de entrada. Se não houver mais entrada, 'sed' sai sem processar mais comandos.

'N'
     Adicione um newline ao espaço E1 e, em seguida, anexe a próxima (Next) linha de entrada ao espaço E1. Se não houver mais entrada, 'sed' sai sem processar mais comandos.

'p'
     Imprima (print) E1.
    
'P'
     Imprima (Print) E1, até o primeiro newline.

'q [CÓDIGO DE SAÍDA]'
     Sai (quit) do 'sed' sem processar mais nenhum comando ou entrada.

'Q [CÓDIGO DE SAÍDA]'
     Este comando é igual a 'q', mas não imprimirá o conteúdo E1. Como 'q', ele pode retornar um código de saída ao chamador.

'r nome do arquivo'
     Lê (read) um arquivo de texto.

'R nome do arquivo'
     Enfileirar uma linha de arquivo para ser lida (Read) e inserida no fluxo de saída ao fim do ciclo atual, ou quando a próxima linha de entrada for lida.

's/REGEXP/SUBSTITUIÇÃO/[FLAGS]'
     Aplique a expressão regular REGEXP ao conteúdo de E1. Se encontrada alguma string como resultado, substitua a string correspondente por SUBSTITUIÇÃO.

't
RÓTULO'
     (test) Desviar para
RÓTULO apenas se houver sucesso na 's'ubstituição. O RÓTULO pode ser omitido, caso em que o próximo ciclo é iniciado.

'T
RÓTULO'
     (test) Desviar para
RÓTULO apenas se não houver sucesso na 's'ubstituição. O RÓTULO pode ser omitido, caso em que o próximo o ciclo é iniciado.

'v [VERSION]'
     (version) Este comando não faz nada, mas faz o 'sed' falhar se as extensões GNU do 'sed' não são suportadas, ou se a versão solicitada não estiver disponível.

'w nome do arquivo'
     Escreva o espaço E1 no nome do arquivo.

'W nome do arquivo'
     Escreva para o nome do arquivo fornecido a parte do espaço E1 até o primeiro newline.

'x'
     Troque (exchange)o conteúdo dos espaços E1 e E2.

'y/src/dst/'
     Transliterar quaisquer caracteres no espaço E1 que correspondam a qualquer do caractere da origem com o caractere correspondente em destino.

'z'
     (zap) Este comando esvazia o conteúdo do espaço E1.

'#'
     Um comentário, até a próxima nova linha.

'{CMD; CMD ...} '
     Agrupe vários comandos juntos.

'='
     Imprime o número da linha de entrada atual (com um newline à direita).

': RÓTULO'
     Especifique a localização de RÓTULO para comandos de desvios ('b', 't', 'T').

Principais opções da linha de comando

-i[sufixo]

    (in-place) Por padrão o sed não modifica automaticamente o arquivo de entrada. Se nenhum arquivo de saída for mencionado, o resultado é enviado para a saída padrão, a tela. Para modificar esse comportamento podemos usar a opção "-i". Por exemplo, o comando a seguir substitui a palavra "planeta" pela palavra "globo" em todas as linhas do arquivo entrada.txt, modificando o arquivo de entrada.

    sed -i 's/planeta/globo/' entrada.txt

Essa opção deve ser usada com muita cautela. Recomenda-se nunca colocar essa opção sem antes testar se o resultado previsto corresponde ao produzido na tela, pois, caso contrário, seu arquivo original será sobrescrito por um resultado não desejado, inclusive pode ser completamente apagado. 

Uma alternativa mais cautelosa é produzir um backup do arquivo original. O sed pode providenciar isso acrescentando um sufixo à opção "-i". Como exemplo, o comando seguinte gera um arquivo de backup chamado entrada.txt.bck:

    sed -i.bck 's/planeta/globo/' entrada.txt

 -n

    (no output) O comportamento padrão do sed é imprimir o espaço E1 ao final de cada ciclo de processameto da linha de entrada, portanto, após executar o comando 'p' e imprimir E1 no arquivo de saída, para concluir o ciclo o sed imprime E1 novamente na saída, o que resulta em duplicar E1 na saída. Para evitar essa duplicação, pode-se usar a opção '-n' na linha de comando. Veja a seguir dois comandos idênticos sem e com a opção "-n":

 

-e script

     Adiciona os comandos no script ao conjunto de comandos a serem executados durante o processamento da entrada.

-f arquivo de script

     Adicione os comandos contidos no arquivo de script ao conjunto de comandos a serem executados durante o processamento da entrada.

-E

     Use expressões regulares estendidas em vez de expressões regulares básicas. As expressões regulares estendidas podem ter mais legibilidade pois costumam ser escritas com menos barras invertidas. Essas expressões regulares estendidas também são aceitas por outros comandos como, por exemplo, o 'egrep'.

Nas regexp estendidas, os caracteres '?', '+', Parênteses '( )', chaves '{}' e '|' funcionam como caracteres especiais sem o uso da barra decrescente '\'. Se você costuma usar esses caracteres como caracteres especiais, usar as regexp estendidas deixa os comandos mais simples e legíveis. Por exemplo, a expressão básica  '\(abc\)\{2,3\}' torna-se '(abc){2,3}' na versão estendida.

--debug

     Uma opção interessante é a opção --debug. Essa é uma opção que foi implementada na versão 4.6, lançada em dezembro de 2018. Com ela, a linha de comando é impressa na sua forma canônica e também são impressas anotações acerca da execução do programa. Caso você se depare com um comando sed escrito numa forma um tanto obscura ou não compreenda muito bem o porquê do seu resultado, pode usar a opção --debug. O exemplo a seguir esclarece o significado de um comando escrito numa forma correta mas pouco intuitiva:

Outras opção comum é "--vesion" que informa a versão do sed. Para maiores informações basta consultar o manual ou a documentação por meio dos comandos seguintes:

     man sed
     info sed

Praticando

Ao solicitar ao sed para realizar alguma instrução, também é possível indicar em quais linhas da entrada essa instrução deve ser realizada. A posição de cada linha da entrada é considerada um endereço e podemos dizer ao sed em quais endereços executar os comandos.

Exemplos usando endereços:

Vamos tomar como base o comando para substituir "planeta" por "globo" em todas as linhas de entrada e enviar a saída para o arquivo saida.txt:

      sed 's/planeta/globo/' entrada.txt > saida.txt

Para realizar o comando acima somente na linha 321 do arquivo entrada.txt:

      sed '321s/planeta/globo/' entrada.txt > saida.txt

O endereço pode conter expressões regulares. Nesse caso é usado entre barras '/'. Para fazer a substituição apenas nas linhas que contém a palavra "universo":

     sed '/universo/s/planeta/globo/' entrada.txt > saida.txt

Para aplicar a substituição procurando somente entre as linhas 100 e 200, inclusive:

     sed '100,200s/planeta/globo/' entrada.txt > saida.txt

Inserindo o caractere "!" (ponto de exclamação) após o endereço inverte a lógica. Portanto para procurar em todas as linhas exceto na linha 321:

     sed '321!s/planeta/globo/' entrada.txt > saida.txt

A última linha é representada pelo caractere "$". Para aplicar o comando somente na última linha (note que não é preciso saber qual é o seu número):

     sed '$s/planeta/globo/' entrada.txt > saida.txt

Passos

Também é possível endereçar indicando uma linha inicial e um passo. A sintaxe é bem simples: 10~5 significa iniciar na linha 10 e saltar 5 linhas sucessivamente, ou seja, o sed irá analisar as linhas 10,15,20, ...

Para imprimir somente as linhas ímpares do arquivo entrada.txt:

     sed -n '1~2p' entrada.txt

O comando 's'

A sintaxe do comando 's' é 's/REGEXP/SUBSTITUIÇÃO/SINALIZADOR/'

Já explicamos as expressões regulares na seção Regexp acima, mas recapitulando, a ideia é procurar no espaço E1 um certo padrão que corresponda ao definido por REGEXP e, encontrado esse padrão, substituí-lo por SUBSTITUIÇÃO.

O caractere separador padrão é a barra '/', mas pode ser substituído por qualquer outro caractere, como, por exemplo, o sub-linha ou underscore '_', porém somente um caractere pode ser usado como separador, isto é, podemos usar 's/.../.../' ou 's_..._..._' mas não podemos usar 's/..._.../'.

O campo SUBSTITUIÇÃO pode conter indicadores do tipo \1, \2, ..., até \9 que se referem a trechos de caracteres agrupados por '\(' e '\)' em REGEXP. 

Para exemplificar o que dissemos at aqui, execute no seu terminal o comando seguinte e verifique que ele transforma  'Sol-Lua' em 'Lua-Sol':

     echo Sol-Lua | sed 's_\(.*\)-\(.*\)_\2-\1_'

A extensão GNU do sed ainda possui um conjunto de sequências formadas por uma barra invertida (eu prefiro chamar de barra decrescente) '\' seguida por uma das letras 'L', 'U', 'l', 'u', 'E' que podem ser usadas para ações envolvendo a mudança de minúscula para maiúscula e vice-versa. Vejamos os seus significados:

'\L'
      Coloque a substituição em minúsculas até que um '\U' ou '\E' seja encontrado.

'\l'
      Coloque o próximo caractere em minúscula.

'\U'
      Coloque a substituição em maiúsculas até que um '\L' ou '\E' seja encontrado,

'\u'
      Coloque o próximo caractere em maiúsculas,

'\E'
      Pare a conversão de maiúsculas e minúsculas iniciada por '\L' ou '\U'.

Para terminar a abordagem do comando 's', ainda temos o SINALIZADOR. Este é representado pela letra 'g' que significa global. Quando não está presente, se o sed realiza uma substituição para uma dada linha de entrada, ele encerra esse ciclo nessa primeira substituição e passa para a próxima linha. Se o SINALIZADOR 'g' estiver presente, o sed procura por outras ocorrências do padrão REGEXP na mesma linha e realiza todas as substituições. 

Múltiplas linhas

Normalmente, o espaço ativo E1 é alimentado por uma única linha do arquivo de entrada, mas isso pode ser mudado com os comandos a seguir.
  • D' deleta linha do espaço E1 até a primeira nova linha, e reinicia o ciclo.
  • G' anexa linha do espaço E2 ao espaço E1, com um newline antes.
  • H' anexa linha do espaço E1 para o espaço E2, com um newline antes.
  • N' anexa linha do arquivo de entrada para o espaço E1.
  • P' imprime linha do espaço E1 até a primeira nova linha.

Exemplos de manipulação de múltiplas linhas:

  • Você quer duplicar todas as linhas de entrado exceto a primeira e última:
    • Vamos testar usando o comando seq para gerar a entrada:
    • Tecle seq 4 | sed -n 'N;p;D' e veja o que acontece
 
     Explicando:
  • 'sed' começa lendo a primeira linha no espaço E1 (ou seja, '1').
  • No início de cada ciclo, o comando 'N' acrescenta um newline e a próxima linha da sua entrada ao E1 (ou seja, '1', '\ n', '2' no primeiro ciclo).
  • O comando 'p' imprime o conteúdo do espaço E1.
  • O comando 'D' então remove o conteúdo do espaço E1 até o primeiro newline (deixando '2' no final do primeiro ciclo).
  • No próximo ciclo, o comando 'N' acrescenta um novo newline e a próxima linha de entrada ao espaço do padrão (por exemplo, '2', '\ n', '3'). 
  • O processo se repete até que a última linha de entrada seja lida.

Links;

Em Português:

Em Inglês:


Comentários

Postagens mais visitadas deste blog

Matemática no terminal de comandos

Precisa fazer um cálculo rápido sem ter que abrir nenhuma aplicação gráfica como, por exemplo, uma planilha de cálculo? O terminal de comandos do Linux é ideal para esses casos. Para cálculos com ponto flutuante usando somente o terminal de comandos temos diversas opções como o comando bc , por exemplo. O comando bc (basic calculator) é utilizado para cálculos com precisão arbitrária e possui a vantagem de já vir instalado em qualquer distribuição Linux, portanto, sem a necessidade de instalar nada! Além do bc, as linguagens de programação de modo geral são ricas em recursos matemáticos e algumas podem ser executadas interativamente no terminal.  Neste artigo mostraremos exemplos de cálculos usando o bc , gnuplot , Python , Scilab, R , Julia, bash e zsh . Operadores matemáticos Para realizarmos os cálculos, precisamos saber a sintaxe básica e que símbolos são usados para representar os operadores matemáticos. Soma, subtração, mu...

Encontrar texto em arquivos pdf

Problema : Você tem zilhões de artigos (papers) em pdf mas quer saber se uma certa sequência de texto (palavra ou frase) está escrita neles. Por exemplo, suponhamos que a frase a ser pesquisada é "fitting" Solução 1: via pdfgrep (mais recomendada)     No terminal de comandos, (trocando "richard" pelo seu nome do usuário), digite: $  find ~ -name '*.pdf' -exec pdfgrep -H -i 'fitting' {} \; Para indicar quantas ocorrências em cada pdf: find ~ -name '*.pdf' -exec pdfgrep -c -H -i 'fitting' {} \; | awk -v FS=":" -v OFS="\t" '$2>0 { print $2, $1 }' | sort -hr Para mostrar somente a primeira ocorrência no pdf: $  find ~ -name '*.pdf' -exec pdfgrep -H -i -m 1 'fitting' {} \; Solução 2: via pdftotext     Nota: pode apresentar mensagens de erro quando há problemas na conversão para texto     No terminal de comandos digite: $  find ~ -name '*.pdf' -exec sh -c 'pdftotext "{}"...

Iniciando o terminal com o logotipo da sua distro e informações do sistema

Vamos ver algumas formas de tornar seu terminal de comandos mais divertido e atraente instalando o neofetch pra exibir o logo da sua distro no terminal de comandos. Abra um terminal de comandos (Ctrl+Shift+T funciona em algumas distribuições); Digite os comandos seguintes (sem incluir o "$"):   $ sudo add-apt-repository ppa:dawidd0811/neofetch $ sudo apt-get update $ sudo apt-get install neofetch Teste o neofetch digitando no terminal: $ clear;neofetch As figuras abaixo indicam que o neofetch identificou (corretamente) duas distros Lubuntu como sendo um Ubuntu, porém uma com ambiente LXDE e outra LXQT. Na primeira figura foi usado o LXTerminal e na segunda o QTerminal: Para exibir o logotipo do Lubuntu 16.04 (e não do Ubuntu) pode-se digitar o seguinte comando:   $ clear;neofetch --ascii_distro Lubuntu  obtendo-se a seguinte tela: No caso do Lubuntu 20.04, o neofetch identificou o "Host" como sendo o VirtualBox 1.2...