Sintaxe grep para pesquisar strings com aspas simples?

Sintaxe grep para pesquisar strings com aspas simples?

Então, eu tenho um arquivo .js conforme abaixo e estou tentando pesquisar com o padrão grep abaixo. Não tenho certeza de qual erro cometi, mas ele não fornece nenhuma saída, mesmo que o arquivo tenha esse padrão. Que erro estou cometendo e como corrigi-lo?

.jsarquivo:

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

minha exigência é encontrar quaisquer ocorrências de:require('query')

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

Responder1

Aspas simples não podem ser incorporadas em strings entre aspas simples. Tentar:

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

Como alternativa, você pode encerrar a string entre aspas simples, adicionar aspas simples com escape e reiniciar a string entre aspas simples:

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

Discussão

Para entender melhor o que está acontecendo, você pode usar instruções echo para ver como o shell processa strings:

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

No exemplo acima, existem duas strings entre aspas simples: require(e ). No que diz respeito ao shell, a string jquerynão está entre aspas.

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

Como o shell aceita aspas simples como parte de strings entre aspas duplas, o procedimento acima funciona bem.

Às vezes, para evitar expansões de shell, é necessário que tudo esteja entre aspas simples. Nesse caso:

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

Acima, existem três strings entre aspas simples: require(, jquery, e ). Entre essas strings estão aspas simples que são escapadas para que o shell as trate como caracteres normais.


Esta resposta pressupõe que o shell seja bash, dash, ash ou outro shell POSIX ou derivado de bourne. Para obter informações sobre ainda outros shells, consulteA resposta de Stéphane Chazelas.

Responder2

Aspas simples não podem ser aninhadas, use aspas duplas ao redor do padrão:

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

Quando você faz:

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

O shell primeiro quebra o padrão em 3 partes, com base nas aspas simples. Primeiro Literal 'require(', depois jquerye depois literal ')'. Então, na verdade, o padrão é considerado como require(jquery), o que não corresponde a nada esperado.

Exemplo:

$ 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');

Responder3

Na maioria dos shells, o 'caractere é um operador de aspas e o caractere de espaço é usado para separar argumentos de um comando. Portanto, seu shell analisará esse comando como 3 argumentos para passar para o /bin/grepcomando:

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

Acima 2, o 'require('jquery')'foi tomado como umcitado require(concatenado com umsem aspas jqueryconcatenado com umcitado ).

Você quer 2ser require('jquery'). Como ', like (e )é um caractere especial para o shell, você precisa citá-lo de alguma forma. A sintaxe depende do shell. Em shells do tipo Bourne, fishe (t)csh, você pode usar aspas duplas, que eles reconhecem como outro operador de aspas:

 grep "require('jquery')"

Em rcshells semelhantes a -( rc, akanga, es) onde '...'é a única forma de aspas, a sintaxe é:

 grep 'require(''jquery'')'

Esse duplo 'interior '...'é o rccaminho paraescaparaqui '.

Para obter detalhes sobre os caracteres especiais nos vários shells do Unix e comocitar/escapareles, vejaComo usar um caractere especial como normal?.

Responder4

Coloque o padrão de pesquisa entre aspas duplas.

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

informação relacionada