Grep-Syntax zum Suchen von Zeichenfolgen mit einfachen Anführungszeichen?

Grep-Syntax zum Suchen von Zeichenfolgen mit einfachen Anführungszeichen?

Ich habe also eine .js-Datei wie unten und versuche, mit dem unten stehenden Grep-Muster zu suchen. Ich bin nicht sicher, welchen Fehler ich gemacht habe, aber es wird keine Ausgabe ausgegeben, obwohl die Datei dieses Muster hat. Welchen Fehler mache ich und wie kann ich ihn korrigieren?

.jsDatei:

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

Meine Anforderung besteht darin, alle Vorkommen von Folgendem zu finden:require('query')

grep, das ich verwende:grep 'require('jquery')' index.js

Antwort1

Einfache Anführungszeichen können nicht in Zeichenfolgen mit einfachen Anführungszeichen eingebettet werden. Versuchen Sie Folgendes:

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

Alternativ können Sie die in einfache Anführungszeichen gesetzte Zeichenfolge beenden, ein maskiertes einfaches Anführungszeichen hinzufügen und die in einfache Anführungszeichen gesetzte Zeichenfolge dann neu starten:

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

Diskussion

Um besser zu verstehen, was passiert, können Sie Echo-Anweisungen verwenden, um zu sehen, wie die Shell Zeichenfolgen verarbeitet:

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

Im obigen Beispiel gibt es zwei Zeichenfolgen in einfachen Anführungszeichen: require(und ). Für die Shell jqueryist die Zeichenfolge nicht in Anführungszeichen gesetzt.

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

Da die Shell einfache Anführungszeichen als Teil von Zeichenfolgen in doppelten Anführungszeichen akzeptiert, funktioniert das Obige einwandfrei.

Um Shell-Erweiterungen zu vermeiden, muss manchmal alles in einem String in einfachen Anführungszeichen stehen. In diesem Fall:

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

Oben gibt es drei Zeichenfolgen in einfachen Anführungszeichen: require(, jquery, und ). Zwischen diesen Zeichenfolgen stehen einfache Anführungszeichen, die maskiert sind, damit die Shell sie als normale Zeichen behandelt.


Diese Antwort setzt voraus, dass es sich bei der Shell um Bash, Dash, Ash oder eine andere POSIX- oder Bourne-basierte Shell handelt. Weitere Informationen zu weiteren Shells finden Sie unterAntwort von Stéphane Chazelas.

Antwort2

Einfache Anführungszeichen können nicht verschachtelt werden. Verwenden Sie doppelte Anführungszeichen um das Muster:

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

Wenn Sie das tun:

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

Die Shell zerlegt das Muster zunächst in drei Teile, basierend auf den einfachen Anführungszeichen. Zuerst Literal 'require(', dann jqueryund dann literal ')'. Das Muster wird also tatsächlich als genommen require(jquery), was erwartungsgemäß mit nichts übereinstimmt.

Beispiel:

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

Antwort3

In den meisten Shells 'ist das Zeichen ein Anführungszeichen und das Leerzeichen wird verwendet, um Argumente eines Befehls zu trennen. Ihre Shell analysiert diesen Befehl also als 3 Argumente, die an den /bin/grepBefehl übergeben werden:

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

Oben wurde 2das als'require('jquery')'zitiert require(verknüpft mit einemnicht zitiert jqueryverknüpft mit einemzitiert ).

Sie möchten 2sein require('jquery'). Da ', wie (und )ein Sonderzeichen für die Shell ist, müssen Sie es irgendwie in Anführungszeichen setzen. Die Syntax hängt von der Shell ab. In Bourne-ähnlichen Shells fishund (t)cshkönnen Sie doppelte Anführungszeichen verwenden, die sie als weiteren Anführungsoperator erkennen:

 grep "require('jquery')"

In rc-ähnlichen Shells ( rc, akanga, es), wo '...'die einzige Form von Anführungszeichen ist, lautet die Syntax:

 grep 'require(''jquery'')'

Dieses Doppel- 'Innere '...'ist der rcWeg zuFluchthier '.

Einzelheiten zu den Sonderzeichen in den verschiedenen Unix-Shells und wie man sieZitat/Fluchtsie, sieheWie verwende ich ein Sonderzeichen als normales Zeichen?.

Antwort4

Setzen Sie das Suchmuster in Anführungszeichen.

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

verwandte Informationen