(linux) grep " escapen/maskieren

senoyches

Lt. Junior Grade
Registriert
Dez. 2018
Beiträge
281
Hallo,

habe mal wieder eine Frage:
ich wollte eine recht einfache Abfrage via grep machen

Code:
Variante1: grep -rl '"61"' Ordnerpfad
Variante2: grep -rl "\"61\"" Ordnerpfad

Wie man den beiden Zeilen entnehmen kann, wollte ich nach dem String "61" suchen, die beiden " inkludiert. Allerdings funktioniert weder die Variante die " zu maskieren via \ noch eine andere alternative mit 2 verschiedenen Anführungszeichen zu arbeiten, die ich anderer Stelle laß.

Hat jemand einen Tipp dazu. Bei einer Suche über Google komme ich auch immer nur zu Variante 2.

Vielen Dank für Eure Hilfe im Voraus.
 
Zuletzt bearbeitet: (falsche Suchziel im Code angegeben Pfad statt Datei)
Sollte beides funktionieren. Vielleicht ist dein Problem eher das -rl? -r recursive macht schonmal keinen Sinn wenn eine einzelne Zieldatei angegeben wird (irgendeinedatei.txt). Und -l zeigt nicht die Fundstelle an sich sondern nur den Dateinamen.
 
Code:
~$ echo '1"61"5'
1"61"5

~$ echo '1"61"5' | grep \"61\"
1"61"5

~$ echo '1"61"5' | grep '"61"'
1"61"5

echo '1"61"5' | grep '\"61\"'
1"61"5

Du kannst das ganz einfach testen

Edit: Bitte selber testen, die Code Blöcke fressen die farbliche Hervorhebung
 
  • Gefällt mir
Reaktionen: PHuV
Evtl. sind in der Datei einfach nicht die normalen ASCII-Anführungszeichen ", sondern die Unicode-Zeichen “ oder Ähnliches?
 
  • Gefällt mir
Reaktionen: up.whatever
kieleich schrieb:
Sollte beides funktionieren. Vielleicht ist dein Problem eher das -rl? -r recursive macht schonmal keinen Sinn wenn eine einzelne Zieldatei angegeben wird (irgendeinedatei.txt). Und -l zeigt nicht die Fundstelle an sich sondern nur den Dateinamen.
ein suchen ohne "" klappt ohne Probleme.

was das -r angeht, da hast du natürlich recht, da handelt es ich eine übertragungsfehler, den ich gleich mal korrigieren werde bei mir ist ein Ordnerpfad angegeben keine Datei
Ergänzung ()

GrumpyCat schrieb:
Evtl. sind in der Datei einfach nicht die normalen ASCII-Anführungszeichen ", sondern die Unicode-Zeichen “ oder Ähnliches?
wie bekomme ich das raus? Und was könnte ich dagegen unternehmen bei der Suche, denn deins scheint das wahre Problem zu seinn
 
Zuletzt bearbeitet:
Piktogramm schrieb:
die Code Blöcke fressen die farbliche Hervorhebung

Seit irgendeinem Xenforo-Update kann CB neben drölfzig Sprachen sogar Bash-Highlighting. Im WYSIWYG-Modus des Beitragseditors die drei Punkte übereinander ganz rechts wählen und in der aufklappenden Zeile das </>, dann die Sprache aussuchen.

Bash:
~$ echo '1"61"5'
1"61"5

~$ echo '1"61"5' | grep \"61\"
1"61"5

~$ echo '1"61"5' | grep '"61"'
1"61"5

echo '1"61"5' | grep '\"61\"'
1"61"5

computerbasecodeeinfügenbash.png


@topic Ohne weitere Parameter mal nur grep probiert, also ohne -rl?
 
  • Gefällt mir
Reaktionen: Piktogramm
DeusoftheWired schrieb:
@topic Ohne weitere Parameter mal nur grep probiert, also ohne -rl?

ich habe @Piktogramm seinen Vorschlag probiert, dort geht alles ohne Probleme, also scheint wie @GrumpyCat meint, tatsächlich an der Formatierung zu liegen.
Ergänzung ()

GrumpyCat schrieb:
Das "Anführungszeichen" z.B. auf
https://r12a.github.io/app-conversion/
reinkopieren und nachschauen. Beim normalen Anführungszeichen kommt Hex-Code 22 (bzw. &quot; als HTML) raus.
Oder auf der Kommandozeile z.B. hexdump -C probieren.
also ich hab mal das " aus einer der betreffenden Datein herauskopiert und bekam bei HEX-UTF als Ergebnis 0022, sollte doch dann das richtige sein, wenn ich dich richtig verstehe.
 
Zuletzt bearbeitet:
DeusoftheWired schrieb:
Seit irgendeinem Xenforo-Update kann CB neben drölfzig Sprachen sogar Bash-Highlighting.
Das ist aber nicht das gleiche wie 'grep --color=auto', was den grep String hervorhebt (viele Distributionen/Shells haben das standardmäßig aktiviert). ANSI/Escape Color Codes kann das Forum leider nicht.
 
  • Gefällt mir
Reaktionen: DeusoftheWired
gut, da das mit den " aus welchen genauen Grund auch immer nicht zu gehen scheint, hab ich eine andere Idee entwickelt:

Bash:
grep -E -r -A 2 -B 1 -n '[^id].*61' Dateipfad

allerdings scheitert es hier noch an dem Problem, was den Part '[^id].*61' angeht, ich hätte gerne nur die Zeilen in denen 61 vorkommt, jedoch nicht der string id, laut meiner recherche negiert man mit ^das nachfolgende Zeichen, darf also nicht vorkommen. Ist irgendwo noch ein Denkefehler, denn die betreffenden Zeilen sind immernoch mit drin.
 
Poste doch einfach den relevanten Teil aus der Datei, aus der Du greppen willst, dann finden wir bestimmt auch den Fehler.
 
Das grep '\"61\"' ist jetzt ein Sonderfall, grep verwendet standardmäßig reguläre Ausdrücke, die ihrereseite wieder Sonderzeichen haben, die wiederum mit \ escaped werden können (oder mit \ erst eine Sonderbedeutung erhalten).

So gesehen funktioniert '\"61\"' zwar auch, ist aber eigentlich falsch. Und mit grep -F müsste dann auch tatsächlich \" in der Datei stehen.

Wenn in der Datei ein anderes Zeichen steht, dürfte eigentlich auch eine normale Suche in einem Texteditor nicht fündig werden. Es sei denn der Editor ist auch ein ganz besonders schlauer...

Zur Not hexdump -C schauen was wirklich los ist. Es gibt ja auch unsichtbare Steuer und Sonderzeichen, oder falls die Datei aus einem Webbrowser kommt, wären auch HTML-Tags und HTML-Entities denkbar.
 
senoyches schrieb:
Bash:
grep -E -r -A 2 -B 1 -n '[^id].*61' Dateipfad

[...] Ist irgendwo noch ein Denkefehler, denn die betreffenden Zeilen sind immernoch mit drin.
Ja, eine bracket expression [] matcht nur ein einzelnes Zeichen.

Das was du willst, müsste man in etwa so darstellen: ([^i]d|i[^d]|[^id]{2}). Ja, das ist grauenhaft und viele Regex-Implementierungen können Lookahead und so Backtracking-Dinge, von denen ich aber nichts verstehe. :)
Ich bin sicher, es gibt Leute hier im Forum, die dir da auch damit weiterhelfen können.
 
Uridium schrieb:
Welche Shell benutzt Du denn?
Bourne Again Shell (bash)
Ergänzung ()

kieleich schrieb:
Das grep '\"61\"' ist jetzt ein Sonderfall, grep verwendet standardmäßig reguläre Ausdrücke, die ihrereseite wieder Sonderzeichen haben, die wiederum mit \ escaped werden können (oder mit \ erst eine Sonderbedeutung erhalten).

So gesehen funktioniert '\"61\"' zwar auch, ist aber eigentlich falsch. Und mit grep -F müsste dann auch tatsächlich \" in der Datei stehen. ....
okay, das nochmal zu gut deutsch, hatte auch schon fgrep oder egrep mein Glück probiert, aber war auch nicht erfolgreicher. Daher kam ich dann auf diesen Weg.

@es handelt sich ganz simpel um configurationsdatein in den einige Bedingungen festgelegt sind:


folgende Zeilen will ich mir herausfilgern

Bash:
    {
      "1": [
        39
      ]
    },
weiter unten gibt es dann als Beispiel eine Zeile mit folgendem Inhalt:

Bash:
 "id": 1390,

Denke jeder erkennt wo das Problem ist in manchen Datein, wo die id zufällig zu der Suche dieses Inhalts dort oben passt, wird dieser mit herausgezogen und am Ende des Tages will ich diese betreffenden Zeilen immer lösche, daher ist es unabdingbar, dass NUR die betreffenden Zeilen dabei sind.

Also dachte ich eben daran die Zahl zu prüfen + es darf in der selben Zeile nicht id vorkommen.
Ergänzung ()

bin auch gerne offen für andere Ideen, wie sed, allerdings wirkte das in grep so simpel, dass ich damit anfangen wollte, muss ja nicht immer mit Kanonen auf Spatzen schießen.
 
Zuletzt bearbeitet:
Wenn das json oder ähnliches ist würde sich ein entsprechender Parser auch noch anbieten (bei json dann z.B. jq) aber die Benutzung dieser Befehle ist manchmal auch ziemlich kryptisch und man muss sich das ein oder andere Tutorial reinziehen

Manchmal helfen auch ein paar Zeilen Python weiter als jedes Bash-Hilfsprogramm-Konstrukt

In deinem Beispiel ist halt unklar wozu der { } Block gehört, vielleicht tut ja auch sowas:

Code:
$ grep -P -B 1 -A 3 '"[0-9]+": \[$' deinbeitrag.txt
    {
      "1": [
        39
      ]
    },
 
Zurück
Oben