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, an printf zu grep.
  • 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

InformationsquelleAutor slezica | 2012-08-08
Schreibe einen Kommentar