Gibt es einen einfachen Weg, um pass ein "raw" string grep?
grep
können nicht gefüttert werden "raw" strings, wenn er von der Befehl-Linie, da einige Zeichen müssen escaped werden, um nicht als Literale behandelt werden. Zum Beispiel:
$ grep '(hello|bye)' # WON'T MATCH 'hello'
$ grep '\(hello\|bye\)' # GOOD, BUT QUICKLY BECOMES UNREADABLE
War ich mit printf
zu auto-escape-Zeichenfolgen:
$ printf '%q' '(some|group)\n'
\(some\|group\)\\n
Dies erzeugt ein bash-entkommen-version der Zeichenfolge, und mit backticks, kann dies leicht weitergegeben werden, um einen grep-Aufruf:
$ grep `printf '%q' '(a|b|c)'`
Es ist jedoch eindeutig nicht dafür gedacht: einige Zeichen in der Ausgabe hier nicht maskiert, und einige sind so unnötig. Zum Beispiel:
$ printf '%q' '(^#)'
\(\^#\)
Den ^
Charakter sollte nicht entgangen sein, wenn Sie übergeben grep
.
Gibt es ein cli-tool, ein raw-string und gibt ein bash-entkommen-version der Zeichenfolge, die direkt verwendet werden können, wie Muster mit grep? Wie kann ich erreichen, das in reiner bash, wenn nicht?
- Es ist wirklich nicht klar, was Sie wollen, zu entkommen, und was Sie nicht tun. Wenn Sie wollen, für Literale Zeichenfolgen, die Verwendung von grep -F.
- Ich habe versucht, die Frage klarer, nehmen Sie sich bitte einen anderen suchen.
- Ich verstehe immer noch nicht. Wie bekommen Sie die strings in der shell
printf
Sie in den ersten Platz? Von diesem Punkt sind Sie genauso bereit, anprintf
zugrep
. - Ich fügte hinzu, ein Beispiel, am Anfang
- single-quoted strings werden nicht interpoliert. Single quote Ihre Beispiel.
grep -F \(some\|group\)\\n
offensichtlich funktioniert (das ist der springende Punkt, der%q
...)- Verwandte: Escape-string für eine sed-ersetzen-Muster
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie versuchen, sich
grep
Erweiterte syntax für Reguläre Ausdrücke, die Art und Weise, das zu tun, ist die Verwendunggrep -E
(akaegrep
). Sie sollten auch wissen, übergrep -F
(akafgrep
) und, in neueren Versionen der GNU Coreutils,grep -P
.Hintergrund: Die ursprüngliche
grep
hatte eine ziemlich kleine Gruppe von regex-Operatoren; es war Ken Thompsons original regulären Ausdruck Umsetzung. Eine neue version mit einem erweiterten repertoire wurde später entwickelt, und aus Gründen der Kompatibilität, bekam einen anderen Namen. Mit GNUgrep
gibt es nur eine binäre, die versteht, die traditionellen, grundlegenden RE-syntax wenn-aufgerufengrep
, und ERE, wenn aufgerufenegrep
. Einige Konstrukte vonegrep
sind ingrep
durch die Verwendung eines backslash-escape-Einführung besonderer Bedeutung.Anschließend der Perl-Programmiersprache erweitert den Formalismus noch weiter; diese regex-Dialekt zu sein scheint, was die meisten Neulinge irrtümlich erwarten
grep
zu unterstützen. Mitgrep -P
es nicht; aber das ist noch nicht sehr verbreitet auf allen Plattformen unterstützt.So, in
grep
, die folgenden Zeichen haben eine spezielle Bedeutung:^$[]*.\
In
egrep
, die folgenden Zeichen haben eine Besondere Bedeutung:()|+?{}
. (Die geschweiften Klammern für die Wiederholung wurden nicht in der ursprünglichenegrep
.) Die Gruppierung der Klammern ermöglichen auch die Rückverweise mit\1
,\2
usw.In vielen Versionen von
grep
ist, können Sie dieegrep
Verhalten, indem Sie einen umgekehrten Schrägstrich vor dieegrep
specials. Es gibt auch spezielle Sequenzen wie\<\>
.In Perl eine große Zahl von zusätzlichen entweicht wie
\w
\s
\d
eingeführt wurden. In Perl 5 regex-Anlage wurde erheblich erweitert, mit non-greedy matching*?
+?
etc, nicht die Gruppierung der Klammern(?:...)
, lookaheads, lookbehinds, etc.... Gesagt haben, dass, wenn Sie wirklich wollen, zu konvertieren
egrep
reguläre Ausdrückegrep
reguläre Ausdrücke ohne Berufung auf irgendwelche externen Prozess, versuchen${regex/pattern/substitution}
für jede deregrep
Besondere Zeichen; aber Sie erkennen, dass dies nicht behandeln Charakter-Klassen, die negierten Zeichenklassen, oder backslash-escapes richtig.Wenn Sie möchten, um die Suche nach einer exakten Zeichenfolge,
-F
sagtgrep
zur Behandlung der Muster, wie Sie ist, ohne interpretation als regex.(Dies wird oft als
fgrep
auch.)fgrep
ist POSIX definiert, so sollte es sein, er ist aber technisch veraltet.(hello|bye)
zu entsprechen "Hallo". Also ich denke das ist die Antwort auf die falsche Frage.-B-
sieht aus wie eine option (in der Tat-B
ist eine gültige grep-option), müssen Sie die--
spezielle option beenden option analysieren; d.h.echo A-B-C | grep -F -- -B-
(beachten Sie, dass die Zitate, die Sie verwendet, die unnötig sind und nichts tun, in diesem Fall, und Sie sind beraubt, die von der shell vor dem Aufruf von grep)Wenn ich mit grep -E mit dem Benutzer zur Verfügung gestellt strings, die ich zu entkommen und Ihnen mit diesem
Beispiel laufen
Diese Weise können Sie sicher fügen Sie die Zeichenfolge in Anführungszeichen in deinem regulären Ausdruck.
z.B. wenn Sie wollte, zu finden, jede Zeile beginnt mit den Benutzer-content, mit dem der Benutzer die Bereitstellung von lustigen Saiten, wie .*
[
, zumindest bei GNU sed 4.2.2.Ich denke, die bisherigen Antworten sind nicht vollständig, da verpassen Sie eine wichtige Sache, nämlich die Zeichenkette, die beginnen mit Bindestrich (-). So, während diese nicht Arbeit:
Diese: