¿Sintaxis grep para buscar cadenas con comillas simples?

¿Sintaxis grep para buscar cadenas con comillas simples?

Entonces, tengo un archivo .js como se muestra a continuación y estoy intentando buscar con el siguiente patrón grep. No estoy seguro de qué error cometí, pero no da ningún resultado a pesar de que el archivo tiene ese patrón. ¿Qué error estoy cometiendo y cómo corregirlo?

.jsarchivo:

var View = require('ampersand-view');
window.jQuery = require('jquery');
require('bootstrap');
require('bootstrap-tooltip');
var extend = require('lodash/assign');

mi requisito es encontrar cualquier aparición de:require('query')

grep que estoy usando:grep 'require('jquery')' index.js

Respuesta1

Las comillas simples no se pueden incrustar en cadenas entre comillas simples. Intentar:

$ grep "require('jquery')" index.js
window.jQuery = require('jquery');

Alternativamente, puede finalizar la cadena entre comillas simples, agregar una comilla simple escapada y luego reiniciar la cadena entre comillas simples:

$ grep 'require('\''jquery'\'')' index.js
window.jQuery = require('jquery');

Discusión

Para comprender mejor lo que está sucediendo, puede usar declaraciones echo para ver cómo el shell procesa las cadenas:

$ echo 'require('jquery')'
require(jquery)

En el ejemplo anterior, hay dos cadenas entre comillas simples: require(y ). En lo que respecta al shell, la cadena jqueryno está entrecomillada.

$ echo "require('jquery')"
require('jquery')

Debido a que el shell acepta comillas simples como parte de cadenas entre comillas dobles, lo anterior funciona bien.

A veces, para evitar expansiones del shell, es necesario que todo esté entre comillas simples. En ese caso:

$ echo 'require('\''jquery'\'')'
require('jquery')

En lo anterior, hay tres cadenas entre comillas simples: require(, jqueryy ). Entre esas cadenas hay comillas simples que se escapan para que el shell las trate como caracteres normales.


Esta respuesta supone que el shell es bash, dash, ash u otro shell POSIX o derivado de bourne. Para obtener información sobre otros shells, consulteLa respuesta de Stéphane Chazelas.

Respuesta2

Las comillas simples no se pueden anidar; utilice comillas dobles alrededor del patrón:

grep "require('jquery')" file.js

Cuando tu lo hagas:

grep 'require('jquery')' file.js

Primero, el shell divide el patrón en 3 partes, según las comillas simples. Primero Literal 'require(', luego jqueryy luego literal ')'. Entonces, en efecto, el patrón se toma como require(jquery), que no coincide con nada esperado.

Ejemplo:

$ cat foo.js 
var View = require('ampersand-view');
window.jQuery = require('jquery');
require('bootstrap');
require('bootstrap-tooltip');
var extend = require('lodash/assign');

$ grep "require('jquery')" foo.js
window.jQuery = require('jquery');

Respuesta3

En la mayoría de los shells, el 'carácter es un operador de comillas y el carácter de espacio se utiliza para separar los argumentos de un comando. Entonces su shell analizará ese comando como 3 argumentos para pasar al /bin/grepcomando:

  1. grep
  2. require(jquery)
  3. index.js

En 2lo anterior, se 'require('jquery')'ha tomado comocitado require(concatenado con unno cotizado jqueryconcatenado con uncitado ).

Tu quieres 2ser require('jquery'). Dado que ', me gusta (y )es un carácter especial del shell, es necesario citarlo de alguna manera. La sintaxis depende del shell. En shells tipo Bourne fishy (t)csh, puedes usar comillas dobles que reconocen como otro operador de comillas:

 grep "require('jquery')"

En rcshells tipo -( rc, akanga, es) donde '...'es la única forma de citar, la sintaxis es:

 grep 'require(''jquery'')'

Ese doble 'interior '...'es el rccamino haciaescaparaquí '.

Para obtener detalles sobre los caracteres especiales en los distintos shells de Unix y cómocita/escaparellos, ver¿Cómo utilizar un carácter especial como uno normal?.

Respuesta4

Coloque el patrón de búsqueda entre comillas dobles.

grep "require('jquery')" index.js

información relacionada