512 Stimmen

Nicht gieriger (zurückhaltender) Regex-Abgleich in sed?

Ich versuche, sed zu verwenden, um Zeilen von URLs zu bereinigen, um nur die Domain zu extrahieren.

Also von:

http://www.suepearson.co.uk/product/174/71/3816/

Ich will:

http://www.suepearson.co.uk/

(entweder mit oder ohne den abschließenden Schrägstrich, es spielt keine Rolle)

Ich habe es versucht:

 sed 's|\(http:\/\/.*?\/\).*|\1|'

und (unter Auslassung des nicht-gierigen Quantors)

sed 's|\(http:\/\/.*\?\/\).*|\1|'

aber ich scheine den nicht-gierigen Quantifizierer nicht zu bekommen ( ? ), um zu funktionieren, so dass am Ende immer die ganze Zeichenfolge übereinstimmt.

68 Stimmen

Eine Randbemerkung: Wenn Sie Ihre Regexe mit "|" abgrenzen, brauchen Sie die "/"s nicht zu escapen. Tatsächlich grenzen die meisten Leute mit "|" anstelle von "/" ab, um die "Zäune" zu vermeiden.

15 Stimmen

@AttishOculus Das erste Zeichen nach dem 's' in einem Ersatzausdruck in sed ist das Trennzeichen. Daher funktionieren auch 's^foo^bar^' oder 's!foo!bar!'

1 Stimmen

Für erweiterte Regex, verwenden Sie sed -E 's... . Dennoch, kein unwilliger Betreiber.

0voto

Dee Punkte 179
echo "/home/one/two/three/myfile.txt" | sed 's|\(.*\)/.*|\1|'

Mach dir keine Mühe, ich habe es aus einem anderen Forum :)

4 Stimmen

So dass Sie ein gieriges Spiel bekommen: /home/one/two/three/ , wenn Sie eine weitere / wie /home/one/two/three/four/myfile.txt werden Sie gierig zustimmen four auch: /home/one/two/three/four Die Frage bezieht sich auf nicht-gierige

0voto

GL2014 Punkte 5336

sed 's|\(http:\/\/www\.[a-z.0-9]*\/\).*|\1| funktioniert auch

0voto

Ports Punkte 401

Eine andere sed-Version:

sed 's|/[:alnum:].*||' file.txt

Sie entspricht / gefolgt von einem alphanumerischen Zeichen (also kein weiterer Schrägstrich) sowie den restlichen Zeichen bis zum Ende der Zeile. Danach wird es durch nichts ersetzt (d. h. gelöscht).

1 Stimmen

Ich denke, es sollte sein "[[:alnum:]]" , nicht "[:alphanum:]" .

0voto

VINAY NAIR Punkte 1

Hier ist etwas, das Sie mit einem zweistufigen Ansatz und awk machen können:

A=http://www.suepearson.co.uk/product/174/71/3816/  
echo $A|awk '  
{  
  var=gensub(///,"||",3,$0) ;  
  sub(/\|\|.*/,"",var);  
  print var  
}'  

Ausgabe: http://www.suepearson.co.uk

Ich hoffe, das hilft!

0voto

laur Punkte 445

Wenn Sie Zugang zu gnu grep haben, können Sie auch perl regex verwenden:

grep -Po '^https?://([^/]+)(?=)' <<< 'http://www.suepearson.co.uk/product/174/71/3816/'
http://www.suepearson.co.uk

Alternativ können Sie auch alles nach die Verwendung der Domain

grep -Po '^https?://([^/]+)\K.*' <<< 'http://www.suepearson.co.uk/product/174/71/3816/'
/product/174/71/3816/

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X