Wie kann man <oder> in einem Parameter in der Shell maskieren?

10

Ich möchte grepmit einem PCRE-Ausdruck verwenden, der das <Zeichen enthält . Bash glaubt, ich möchte umleiten, aber ich möchte nicht. Wie kann ich entkommen <?

hakre
quelle

Antworten:

11

Ich konnte es mit einem Backslash machen:

25 % grep \< xmospos.c
#include        <stdio.h>
#include        <stdlib.h>
#include        <getopt.h>
#include        <X11/Xlib.h>

Ein zitierter weniger als und ein zitierter Backslashed weniger als beide gaben doofe Antworten.

Bruce Ediger
quelle
5
Ja, oder setzen Sie es in einfache Anführungszeichen
Glenn Jackman
Ich muss noch lernen, zB wie das genau mit Escape grep -oP '(?< )(.*)$'funktioniert : funktioniert zum Beispiel nicht mit einfachen Anführungszeichen. Versuchte es zuerst.
hakre
@hakre Es scheint einen Syntaxfehler in Ihrem regulären Ausdruck zu geben. Meinten Sie (?<! )(.*)$oder (?<= )(.*)$?
Gilles 'SO - hör auf böse zu sein'
4

Zwei einfache Regeln:

  • Ein Backslash \Centgeht dem nächsten Zeichen, was auch immer es ist, außer einer neuen Zeile.
  • Einfache Anführungszeichen schließen 'text'jedes Zeichen zwischen ihnen aus, einschließlich eines Backslashs, jedoch ohne ein einfaches Anführungszeichen (da es das Ende des zitierten Textes markiert).

Somit:

grep -P '<html>' myfile
grep -P \<html\> myfile
grep -P '(?<!<)html' myfile
grep -P \(\?\<\!\<\) myfile

Wenn Sie ein Argument übergeben müssen, das einfache Anführungszeichen enthält, können Sie '\''ein einfaches Anführungszeichen in einfache Anführungszeichen "maskieren". Technisch gesehen beendet dies den ersten wörtlichen Text, setzt dann ein Literal 'in dasselbe Wort und dann noch mehr wörtlichen Text in dasselbe Wort.

grep '^D'\''oh!' myfile

Der Rest der Angebotsregeln (zusammengefasst):

  • Sie müssen mindestens manchmal die folgenden Zeichen zitieren: Leerzeichen und !"#$&'()*;<>?[\]^`{|}~(mit anderen Worten, die folgenden Zeichen sind sicher: Buchstaben, Ziffern %+,-./:=@_und Nicht-ASCII-Zeichen).
  • Zwischen doppelten Anführungszeichen werden alle Zeichen außer "$\`und buchstäblich verwendet (in Shells mit aktiviertem Verlauf) !. In der Zeichenfolge wird ein umgekehrter Schrägstrich zwischen doppelten Anführungszeichen angezeigt, sofern er nicht vor einem der nicht wörtlichen Zeichen steht.

Diese Regeln gelten für Bash- und andere Bourne-Muscheln (wie Asche und Ksh). Sie gelten auch für zsh (außer dass =nach Leerzeichen möglicherweise Anführungszeichen erforderlich sind). Die Regeln in csh / tcsh und in Fish sind unterschiedlich.

Gilles 'SO - hör auf böse zu sein'
quelle