
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?
.js
archivo:
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 jquery
no 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(
, jquery
y )
. 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 jquery
y 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/grep
comando:
grep
require(jquery)
index.js
En 2
lo anterior, se 'require('jquery')'
ha tomado comocitado require(
concatenado con unno cotizado jquery
concatenado con uncitado )
.
Tu quieres 2
ser 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 fish
y (t)csh
, puedes usar comillas dobles que reconocen como otro operador de comillas:
grep "require('jquery')"
En rc
shells tipo -( rc
, akanga
, es
) donde '...'
es la única forma de citar, la sintaxis es:
grep 'require(''jquery'')'
Ese doble '
interior '...'
es el rc
camino 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