Bei der Verwendung sed
erstelle ich oft ziemlich komplizierte und komplizierte reguläre Ausdrücke, die ich zweimal in einer Datei abgleichen muss. Gibt es eine Möglichkeit für mich, diesen regulären Ausdruck zu speichern und ihn nur zweimal zu referenzieren?
Vielleicht etwas, das so aussieht?
sed ' complicated_regex=/^(([a-f0-9]{32})+([a-zA-Z0-9=]{{$i}})?)+$/
s/complicated_regex:complicated_regex/simple-output/
' my_file
Update: Eine Antwort hat die Lösung der Verwendung einer Bash-Variablen vorgestellt. Das funktioniert nicht. Gegeben a test.txt
.
#test.txt
foo bar
bar foo
Und das Drehbuch
#!/bin/bash
VALUE='foo \([a-z]\+\)'
sed 's/"${VALUE}"/foo happy \1/' test.txt
Dies sollte die Ausgabe erzeugen
foo happy bar
bar foo
Aber stattdessen bekomme ich den Fehler
sed: -e expression #1, char 24: invalid reference \1 on `s' command's RHS
sed
regular-expression
Cory Klein
quelle
quelle
perl -pe 's/^(([a-f0-9]{32})+([a-zA-Z0-9=]{{$i}})?)+:\1$/simple_output/' my_file
sed 's/'"${VALUE}"'/foo happy \1/' test.txt
Antworten:
Sie können Shell-Variablen verwenden:
Ich bin mir nicht sicher, was Sie damit gemeint haben
$i
, aber Sie müssen es möglicherweise außerhalb von einfachen Anführungszeichen setzen:quelle
sed
Befehl von der Shell aus aufgerufen wird, aber es gibt eine ähnliche Lösung für fast alle Programmiersprachen. (Und ich denke nicht, dass es möglich ist, Variablen innerhalb zu verwendensed
.)s/$complicated_regex/\1/
gibt einen Fehler aus, der besagt, dass dies eine ungültige Referenz ist.sed "s/^${complicated_regex}:${complicated_regex}\$/simple-output/" my_file
Der einfachste Weg, einen Shell-Variablenwert einzufügen
sed
und sich keine Gedanken darüber zu machen, wie sich Ihr Backslash-Escape für den Rest Ihressed
Skripts ändern muss , besteht darin, alles in einfache Anführungszeichen außer der Variablen zu setzen und dies in doppelte Anführungszeichen zu setzen.Alle folgenden Codebeispiele setzen voraus:
VALUE='foo \([a-z]\+\)'
Der folgende fehlerhafte Code schlägt fehl, weil die Variable
VALUE
nicht erweitert wird:Der folgende fehlerhafte Code schlägt fehl, weil der Backslash
\1
von der Shell gefressen wird (weil er in doppelten Anführungszeichen und nicht in einfachen Anführungszeichen steht), bevor ersed
jemals angezeigt wird:Der folgende Code funktioniert wie erwartet:
Der folgende Code funktioniert auch:
Folgendes auch:
Aber warum kompliziert werden? Einfache Anführungszeichen um ein
sed
Skript machen alles viel klarer, insbesondere für die Nicht-Shell-Scripting-Gurus, die Ihren Code lesen. Mein bevorzugter Weg ist es wiederum, einfache Anführungszeichen nur für die Variablenerweiterung in doppelte Anführungszeichen zu setzen und direkt zu einfachen Anführungszeichen zurückzukehren:quelle