一重引用符を含む文字列を検索するための 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(と という2 つの一重引用符で囲まれた文字列があります。)シェルに関しては、文字列jqueryは引用符で囲まれていません。

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

シェルは二重引用符で囲まれた文字列の一部として一重引用符を受け入れるため、上記は正常に機能します。

場合によっては、シェルの展開を避けるために、すべてを一重引用符で囲んだ文字列にする必要があります。その場合:

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

上記には、、、の 3 つの単一引用符で囲まれた文字列があります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、、)では、引用符は のみの形式であるため、構文は次のようになりますakangaes'...'

 grep 'require(''jquery'')'

その二重''...'rc逃げるそこ'に。

さまざまなUnixシェルの特殊文字とその使い方の詳細については、引用/逃げる彼らを見て特殊文字を通常の文字として使用するにはどうすればよいですか?

答え4

検索パターンを二重引用符で囲みます。

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

関連情報