Warum enthält die Zeichenklasse sed regexp digit ein CR-Zeichen, wenn sich die letzte Ziffer am Zeilenende befindet?

345
karatedog

Ich wollte die Größe der Content-Length aus einer URL extrahieren und die URL + $ size in derselben Zeile ausgeben.

Die Daten, mit denen ich gearbeitet habe:

> curl -I -s http://yahoo.com HTTP/1.1 301 Redirect Date: Thu, 10 Mar 2016 13:58:34 GMT Via: https/1.1 ir18.fp.bf1.yahoo.com (ApacheTrafficServer) Server: ATS Location: https://www.yahoo.com/ Content-Type: text/html Content-Language: en Cache-Control: no-store, no-cache Connection: keep-alive Y-Trace: BAEAQAAAAADEVnKTAIhTVAAAAAAAAAAA52rmwEDlxSwAAAAAAAAAAAAFLbI13bX.AAUtsjXdvxvBYm3xAAAAAA-- Content-Length: 304 

Hier ist ein vereinfachtes Beispiel. Ich extrahierte die Content-Length und schnitt einfach das Feld ab, das ich brauche. Anstelle der URL empfange ich nur ein "a":

> size=$(curl -I -s http://yahoo.com | grep "Content-Length:" | cut -f2 -d" "); echo $size"a" > a04 

Das "a"überschreibt die erste Ziffer.

Es stellt sich heraus, dass die Content-Length-Kopfzeile mit einem 0D-Zeichen geschlossen ist und zusammen mit den Zahlen dieser Wagenrücklauf erscheint. Ich dachte, cutdas wäre nicht klug genug, um die 0D auszuschalten, aber einfach durch das Ändern der Extraktion in ein reguläres Ausdrückwerkzeug verhält es sich genauso:

> size=$(curl -I -s http://yahoo.com | grep "Content-Length:" | sed 's/Content-Length: \([[:digit:]]*\)/\1/'); echo $size"a" > a04 

Was bedeutet, dass die Zeichenklasse [[: digit:]] auch das 0D-Zeichen enthält. Ich habe versucht, das Ende der Zeichenfolge explizit zu markieren, und es hat funktioniert:

> size=$(curl -I -s http://yahoo.com | grep "Content-Length:" | sed 's/Content-Length: \([[:digit:]]*\).*/\1/'); echo $size"a" > 304a 

TL; DR: Warum enthielt die Regex-Zeichenklasse das 0D-Zeichen?

0

1 Antwort auf die Frage

1
choroba

Hat es nicht getan

strintg: Content-Length: 304\0d matched: Content-Length: 304 replaced by: 304 result: 304\0d 

Es wurde nicht angepasst und daher nicht entfernt. Es ist einfach dort geblieben.

epischer Mindlock ist passiert. karatedog vor 8 Jahren 0