Desejo pesquisar as linhas que contêm qualquer um dos seguintes caracteres:

: / / ? # [ ] @ ! $ & " ( ) * + , ; = %

Resposta

grep "[]:/?#@\!\$&"()*+,;=%[]" 

Dentro de uma expressão entre colchetes, [...], muito poucos caracteres são ” especial ” (apenas um subconjunto muito pequeno, como ], - e ^, e as três combinações [=, [: e [.). Ao incluir ] em [...], o ] deve vir primeiro (possivelmente após um ^). Optei por colocar o ] primeiro e o [ por último para simetria.

A única outra coisa a lembrar é que uma string entre aspas simples não pode incluir aspas simples, portanto, usamos aspas duplas em torno da expressão. Como usamos uma string entre aspas duplas, o shell irá vasculhar para que as coisas se expandam. Por esse motivo, escapamos de $ como \$, o que fará com que o shell forneça um $ para grep, e escapamos ! como \! também porque é “uma história expansão em bash (apenas em shells bash interativos).

Você gostaria de incluir uma barra invertida no definido, você teria que escapar como \\ para que o shell fornecesse uma única barra invertida para grep. Além disso, se você quiser incluir um backtick `, também deve ser escapado como \`, pois ele inicia uma substituição de comando de outra forma.

O comando acima extrairia qualquer linha que contivesse pelo menos um dos caracteres na expressão entre colchetes.


Usar uma string entre aspas simples em vez de uma string entre aspas duplas, que contorna a maioria dos aborrecimentos com quais caracteres o shell interpreta:

grep "[]:/?#@!$&"""""()*+,;=%[]" 

Aqui, a única coisa a lembrar, além da colocação do ], é que uma única string entre aspas não pode incluir uma aspa simples, então, em vez disso, usamos uma concatenação de três strings:

  1. "[]:/?#@!$&"
  2. """
  3. "()*+,;=%[]"

Outra abordagem seria usar a classe de caracteres POSIX [[:punct:]]. Corresponde a um único caractere do conjunto !"#$%&"()*+,-./:;<=>?@[\]^_`{|}~, que é um conjunto maior do que o “dado na pergunta (contém adicionalmente "-.<>^_`{|}~), mas são todos os ” caracteres de pontuação ” que o POSIX define.

LC_ALL=C grep "[[:punct:]]" 

Comentários

  • @ilkkachu Eu não ‘ identifiquei o $ aí! Obrigado!
  • Quando tento executar o comando, recebo este erro bash: !\: event not found.
  • @ user9371654 Droga bash! 🙂 Fuja do ! também … Não sendo um bash usuário esqueci disso. Vou atualizar …
  • "[\!]" se expande para [\!] mesmo quando a expansão do histórico está habilitada, isso corresponderia à barra invertida. Você ‘ d precisa de aspas simples ou usando \! outsi de aspas.
  • Observe que ‘ não é apenas bash, zsh também tem aquele recurso irritante herdado do csh. em csh, ! especial dentro de '...' também, e também quando não interativo. No entanto, em csh (ao contrário de bash ou zsh), usar "\!" funcionaria aqui (a barra invertida foi removida).

Resposta

Você pode usar [:punct:] classe de caracteres se você não se preocupe que também corresponda a outros sinais de pontuação e caracteres especiais:

grep "[[:punct:]]" file 

Comentários

  • O punct classe de caracteres (não macro) corresponde a !"#$%&'()*+,-./:;<=>?@[\]^_ {|} ~ `na localidade C, que é um conjunto ligeiramente maior de caracteres do que o que o usuário tem, mas pode ser bom o suficiente.

Resposta

Você pode usar regex completo para encontrar caracteres especiais dentro de colchetes se você estiver procurando por um caractere que seja especial. Um ótimo recurso para praticar, aprender e verificar sua Expressão Regular é regex101.com .

Isso usa expressões regulares Perl, que podem ser usadas com GNU grep com a opção -P:

grep -P "(\:|\/|\?|\#|\@|\!|\\$|\&|\"|\(|\)|\*|\+|\,|\;|\=|\%|\[|\])" ^^^ 

Observe que você precisa de dois backsl cinzas na frente do cifrão, pois tem um significado especial na casca, e a primeira barra invertida escapará dela para a casca. (Com apenas uma barra invertida na frente, o shell removeria a barra invertida, grep veria um cifrão sem escape significando fim de linha e corresponderia a qualquer linha de entrada.)

Se o seu terminal suporta cores, jogue cores também,

grep --color=auto -P "(\:|\/|\?|\#|\@|\!|\\$|\&|\"|\(|\)|\*|\+|\,|\;|\=|\%|\[|\])" 

Aqui está a explicação do meu regex de regex101.com

/(\:|\/|\?|\#|\@|\!|\$|\&|\"|\(|\)|\*|\+|\,|\;|\=|\%|\[|\])/gm 1st Capturing Group (\:|\/|\?|\#|\@|\!|\$|\&|\"|\(|\)|\*|\+|\,|\;|\=|\%|\[|\]) \: matches the character : literally (case sensitive) \/ matches the character / literally (case sensitive) \? matches the character ? literally (case sensitive) \# matches the character # literally (case sensitive) \@ matches the character @ literally (case sensitive) \! matches the character ! literally (case sensitive) \$ matches the character $ literally (case sensitive) \& matches the character & literally (case sensitive) \" matches the character " literally (case sensitive) \( matches the character ( literally (case sensitive) \) matches the character ) literally (case sensitive) \* matches the character * literally (case sensitive) \+ matches the character + literally (case sensitive) \, matches the character , literally (case sensitive) \; matches the character ; literally (case sensitive) \= matches the character = literally (case sensitive) \% matches the character % literally (case sensitive) \[ matches the character [ literally (case sensitive) \] matches the character ] literally (case sensitive) 

Comentários

  • Não, com ERE padrão, você não pode ‘ escapar do fechamento ] com barra invertida. a barra invertida não é especial entre expressões de colchetes. Para ter um ] dentro de uma expressão de colchetes, ele precisa ser o primeiro: []other], não [ot\]her]. Isso ‘ é diferente de PCREs que regex101 descreve por padrão.
  • Funcionaria com pcregrep ou GNU grep -P, no entanto. E, de certa forma, o comportamento do Perl é mais direto: uma barra invertida sempre torna um caractere especial normal.
  • Corrigido para -P, desculpe por isso, confundi -E e -P

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *