Синтаксис grep для поиска строк с одинарными кавычками?

Синтаксис grep для поиска строк с одинарными кавычками?

Итак, у меня есть файл .js, как показано ниже, и я пытаюсь выполнить поиск с помощью приведенного ниже шаблона grep. Я не уверен, какую ошибку я сделал, но он не выдает никакого вывода, хотя в файле есть этот шаблон. Какую ошибку я делаю и как ее исправить?

.jsфайл:

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

Мое требование — найти любые вхождения:require('query')

grep я использую:grep 'require('jquery')' index.js

решение1

Одинарные кавычки не могут быть встроены в строки, заключенные в одинарные кавычки. Попробуйте:

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

В качестве альтернативы можно завершить строку в одинарных кавычках, добавить экранированную одинарную кавычку, а затем перезапустить строку в одинарных кавычках:

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

Обсуждение

Чтобы лучше понять происходящее, вы можете использовать операторы echo, чтобы увидеть, как оболочка обрабатывает строки:

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

В приведенном выше примере есть две строки в одинарных кавычках: require(и ). С точки зрения оболочки строка jqueryне заключена в кавычки.

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

Поскольку оболочка принимает одинарные кавычки как часть строк в двойных кавычках, приведенный выше код работает нормально.

Иногда, чтобы избежать расширений оболочки, нужно, чтобы все было в строке в одинарных кавычках. В этом случае:

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

В приведенном выше примере есть три строки в одинарных кавычках: require(, jqueryи ). Между этими строками находятся одинарные кавычки, которые экранированы, чтобы оболочка воспринимала их как обычные символы.


Этот ответ предполагает, что оболочка — bash, dash, ash или другая оболочка POSIX или производная от bourne. Для получения информации о других оболочках см.Ответ Стефана Шазеласа.

решение2

Одинарные кавычки не могут быть вложенными, используйте двойные кавычки вокруг шаблона:

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

Когда вы это делаете:

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

Сначала оболочка разбивает шаблон на 3 части, основываясь на одинарных кавычках. Сначала Literal 'require(', затем jquery, а затем literal ')'. Таким образом, по сути шаблон принимается как require(jquery), что не соответствует ничему ожидаемому.

Пример:

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

решение3

В большинстве оболочек 'символ является оператором кавычек, а символ пробела используется для разделения аргументов команды. Поэтому ваша оболочка будет анализировать эту команду как 3 аргумента для передачи команде /bin/grep:

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

Выше 2было 'require('jquery')'принято какцитируется require(объединенный снецитируемый jqueryобъединенный сцитируется ).

Вы хотите 2быть require('jquery'). Поскольку ', как (и и )является специальным символом для оболочки, вам нужно заключить его в кавычки каким-то образом. Синтаксис зависит от оболочки. В оболочках типа Bourne, fishи (t)csh, вы можете использовать двойные кавычки, которые они распознают как другой оператор кавычек:

 grep "require('jquery')"

В rcоболочках типа ( rc, akanga, es), где '...'есть единственная форма кавычек, синтаксис следующий:

 grep 'require(''jquery'')'

Этот двойной 'внутренний '...'путь rc-побегздесь '.

Подробную информацию о специальных символах в различных оболочках Unix и о том, как их использовать, см.цитировать/побегих, см.Как использовать специальный символ как обычный?.

решение4

Заключите шаблон поиска в двойные кавычки.

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

Связанный контент