2017-04-19 2 views
0

In OSX, sed verhält sich wie folgt:Sed überschreibt Match Gruppen von Linie in OSX beginnend

echo -en 'xxx abc\r\nxxx aa bb cc\r\n' | sed -E 's/xxx (.*)/\1->/g' 
->c 
-> bb cc 

Während ich die erwartete folgende:

echo -en 'xxx abc\r\nxxx aa bb cc\r\n' | sed -E 's/xxx (.*)/\1->/g' 
abc-> 
aa bb cc-> 

Ich bin einfach passend eine Linie mit xxx dann Alles andere irgendwo in eine von mir konstruierte Saite legen. Es scheint, dass es mit \r verwandt ist, aber bin nicht ganz sicher, wie man es repariert, ohne zuerst \r von der Textdatei zuerst zu beschneiden. (Das obige Beispiel erwähnt keine Textdatei, aber Sie können sich vorstellen, dass die Ausgabe von echo in einer Textdatei war).

Gibt es eine Erklärung warum -> die Gruppenübereinstimmung überschreibt?

+0

Möchten Sie unbedingt '\ r' beibehalten? probiere 'sed -E 's/\ r //; s/xxx (. *)/\ 1 ->/g; s/$/\/r \ '' – Sundeep

+0

Dateien in OSX haben diese, aber natürlich brauche ich' \ r' nicht, obwohl das Dumping sie dazu bringt, dass diese Dateien in OSX schlecht aussehen. Auch in deiner Lösung "->" frißt man Charaktere weg. – hyiltiz

+0

Ich überprüfte es auf 'sed (GNU sed) 4.2.2' und es gibt Ihre erwartete Ausgabe ... – Sundeep

Antwort

1

Es wird durch die carriage-return (\r) Zeichen verursacht.

auf OS X getestet:

[STEP 107] $ printf 'xxx abc\r\nxxx aa bb cc\r\n' | sed -E 's/xxx (.*)/\1->/g' 
->c 
-> bb cc 
[STEP 108] $ printf 'xxx abc\r\nxxx aa bb cc\r\n' | sed -E 's/xxx (.*)/\1->/g' \ 
      | hexdump -C 
00000000 61 62 63 0d 2d 3e 0a 61 61 20 62 62 20 63 63 0d |abc.->.aa bb cc.| 
00000010 2d 3e 0a           |->.| 
[STEP 109] $ printf 'xxx abc\nxxx aa bb cc\n' | sed -E 's/xxx (.*)/\1->/g' 
abc-> 
aa bb cc-> 
[STEP 110] $ printf 'abc\r->\n' 
->c 
[STEP 111] $ 

printf 'abc\r->\n' Nehmen Sie zum Beispiel: Es ersten abc drucken würde, dann \r die Cursor zurück an den Anfang der Zeile bewegen würde, dann -> drucken, die ab überschreiben würde, so endlich sehen wir ->c.

+0

JA! Ich habe herausgefunden, dass es etwas mit dem Anpassen und Drucken von '\ r' zu tun hat, das in OSX vorhanden ist. Aber ich habe nie gewusst, dass "\ r \ n" tatsächlich für "Flush an den Anfang, dann weiter zur nächsten Zeile" steht. Vielen Dank! – hyiltiz

Verwandte Themen