2016-12-16 5 views
0

erhalte ich einen Fehler mit sed:sed Fehler sed: -er Ausdruck # 1, char 23: ungültige Referenz 1 auf `s'RHS Befehl

sed: -e expression #1, char 23: invalid reference \1 on `s' command's RHS 

Hier mein Skript ist:

result=`$(PERL) parse.pl report.log`; \ 
echo $$result | sed "s/.*([a-zA-Z0-9._]*).*/\1/p"; 

Grundsätzlich ist die Ausgabe meiner perl-Skript etwas wie folgt aus:

ERR: dir/out/file/report/temp.log (23): some error message here 

Was ich sed erwarten, dass der Weg zu tun ist, zu erhalten, die dir/out/Datei/repor t/temp.log.

Aber ich zu diesem Fehler steckte: sed: -en Ausdruck # 1, char 23: ungültige Referenz \ 1 auf `s'Befehl des RHS

was bin ich fehle?

Antwort

0

Es ist, weil sed behandelt ( als Zeichenmuster standardmäßig. Sie müssen entweder,

  • die geklam- mert Flucht,

    echo $$result | sed "s/.*\([a-zA-Z0-9._]*\).*/\1/p"; 
    
  • Benutzer erweiterte reguläre Ausdrücke -E

    echo $$result | sed -E "s/.*([a-zA-Z0-9._]*).*/\1/p"; 
    

Die Regex, die Sie haben mit Willen nicht ausreichend sein um den Verzeichnisnamen aus der Zeichenfolge abzurufen. Stattdessen können Sie schreiben

$ sed -E 's/ERR: ([^ ]*).*/\1/g' 

Beispiel

$ echo "ERR: dir/out/file/report/temp.log (23): some error message here" | sed -E 's/ERR: ([^ ]*).*/\1/g' 
dir/out/file/report/temp.log 
+0

habe ich versucht, die zweiten, mit der Option -E, obwohl kein Fehler ausgelöst wurde, aber es sieht aus wie es nicht in der Lage war, den Dateipfad zu erhalten. Ist meine Regex korrekt? –

+0

@chrisyo Die Regex ist falsch, um diesen Teil der Zeichenfolge zu erhalten. Ich habe die Antwort aktualisiert. – nu11p01n73R