Saltar al contenido

Buscar caracteres especiales usando grep

Solución:

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

Dentro de una expresión entre corchetes, [...], muy pocos caracteres son “especiales” (solo un subconjunto muy pequeño, como ], - y ^, y las tres combinaciones [=, [: and [.). When including ] en [...], los ] debe venir primero (posiblemente después de un ^). Opté por poner el ] primero y el [ last for symmetry.

The only other thing to remember is that a single quoted string can not include a single quote, so we use double quotes around the expression. Since we use a double quoted string, the shell will poke around in it for things to expand. For this reason, we escape the $ as $ which will make the shell give a literal $ to grep, and we escape ! as ! too as it’s a history expansion in bash (only in interactive bash shells though).

Would you want to include a backslash in the set, you would have to escape it as \ so that the shell gives a single backslash to grep. Also, if you want to include a backtick `, it too must be escaped as ` as it starts a command substitution otherwise.

The command above would extract any line that contained at least one of the characters in the bracketed expression.


Using a single quoted string instead of a double quoted string, which gets around most of the annoyances with what characters the shell interprets:

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

Aquí, lo único que hay que recordar, aparte de la colocación del ], es que una sola cadena entre comillas no puede incluir una sola comilla, por lo que en su lugar usamos una concatenación de tres cadenas:

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

Otro enfoque sería utilizar la clase de caracteres POSIX [[:punct:]]. Esto coincide con un solo personaje del conjunto !"#$%&'()*+,-./:;<=>[email protected][]^_`{|}~, el cual es un mas grande establecido de lo que se da en la pregunta (además contiene "-.<>^_`{|}~), pero son todos los “caracteres de puntuación” que define POSIX.

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

Puedes usar [:punct:] clase de carácter si no le importa que también coincida con otros signos de puntuación y caracteres especiales:

grep '[[:punct:]]' file

Puede usar expresiones regulares completas para encontrar caracteres especiales dentro de corchetes si está buscando un carácter que sea un carácter especial. Un gran recurso para practicar, aprender y verificar su expresión regular es regex101.com.

Esto usa expresiones regulares de Perl, que se pueden usar con GNU grep con el -P opción:

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

Tenga en cuenta que necesita dos barras diagonales inversas delante del signo de dólar, ya que tiene un significado especial en el caparazón, y la primera barra invertida se escapará para el caparazón. (Con solo una barra invertida al frente, el caparazón eliminaría la barra invertida, grep vería un signo de dólar sin escape que significa el final de la línea y coincidiría con cualquier línea de entrada).

Si su terminal admite colores, agregue colores también,

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

Aquí está la explicación de mi expresión regular 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)
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *