
Итак, у меня есть файл .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
:
grep
require(jquery)
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