2017-01-15 8 views
0

Ich folge zu einzige Zeile die versuchen, Arbeits Befehl es in einem Bash auszuführen:einzelne Zeile cmd sed Mac OSX el Capitan

LANG=C sed -E ' 
s/$/\\z/ 
:while 
s/([0-9]{6})(.*\\z.*)/\2 "\1"/ 
twhile 
s/.*\\z//' myfile.txt 

Probe für myfile.txt:

123456 \ r \ n \ r \ n 789.112 \ r \ n 889667

Ausgabe des obigen cmd (was das erwartete Ergebnis ist) :

"123456", "789.112" "889.667"

weder diese:

LANG=C sed -E 's/$/\\z/; :while; s/([0-9]{6})(.*\\z.*)/\2 "\1"/; twhile; s/.*\\z//' myfile.txt 

output:

123456 \ r \ r \ \ n n 789.112 \ r \ n 889667 \ z

oder dies tatsächlich funktioniert:

LANG=C sed -E 's/$/\\z/' -E :while -E 's/([0-9]{6})(.*\\z.*)/\2 "\1"/;twhile' -E 's/.*\\z//' myfile.txt 

Ausgang:

sed: -E: Keine solche Datei oder das Verzeichnis

sed: während: Keine solche Datei oder das Verzeichnis

sed : -E: Keine solche Datei oder kein Verzeichnis

sed: s/([0-9] {6}) (. \ z.)/\ 2 "\ 1" /; twhile: Datei oder Verzeichnis

Sed: -E: Datei oder das Verzeichnis

Sed: s /.* \ z //: Datei oder das Verzeichnis

123456 \ r \ n \ r \ n 789.112 \ r \ n 889.667 \ z

Als Ergebnis sowohl zeigt das eine und einzige Zeile der Datei anstelle von mehreren Instanzen des Musters/[0-9] {6}/

Ich glaube, dass ich vermisse g etwas über die Verwendung von Semikolon ..

+0

Welchen Fehler erhalten Sie? – 123

+0

Beide zeigen die einzige Zeile der Datei anstelle der Mehrfachinstanz des Musters/[0-9] {6}/an. Verpasste diesen Punkt in der Post, danke;) – user2702566

+0

Können Sie Beispiel Eingabe und Ausgabe? – 123

Antwort

1

sed ist für einfache Substitutionen auf einzelnen Zeilen, das ist alles. Was Sie versuchen, ist nicht das, also sollten Sie nicht versuchen, sed zu verwenden, um es zu tun. Es ist nicht klar, was Sie zu tun versuchen, aber das ist es:

$ awk -v RS='\\s+' 'NF{print "\"" $0 "\""}' file 
"123456" 
"789112" 
"889667" 

Das GNU awk verwendet für Multi-char RS und die \s Abkürzung für [[:space:]].Die oben wurde auf dieser Eingabedatei ausführen:

$ cat -v file 
123456 ^M 
^M 
789112 ^M 
889667 

Was ist das, was ich denke, Sie versuchen, mit Ihrem geschrieben Abtastwerteingang auszudrücken:

$ printf '123456 \r\n \r\n 789112 \r\n 889667' | 
    awk -v RS='\\s+' 'NF{print "\"" $0 "\""}' 
"123456" 
"789112" 
"889667" 

oder wenn Sie lieber nach passenden Strings suchen als die Leerzeichen, die die Zeichenfolgen trennen:

$ printf '123456 \r\n \r\n 789112 \r\n 889667' | 
    awk -v RS='[0-9]{6}' '{print "\"" RT "\""}' 
"123456" 
"789112" 
"889667" 
+0

Vielen Dank für Ihre Hilfe. Meine Datei ist eine einzelne Zeile, die wirklich wie folgt aussieht: 123456 \ r \ n \ r \ n 789112 \ r \ n 889667'. Ich begann mit awk, konnte aber nicht den richtigen Weg finden, es zu tun, also versuchte ich sed ... Aber es scheint, dass ich falsch liege, welches Werkzeug zwischen sed und awk zu verwenden ist ... – user2702566

+0

Aber per definitionem wenn es enthält '\ r \ n' ist keine einzige Zeile, da Zeilen mit' \ r \ n' unter Windows und '\ n' unter UNIX enden, also gibt es auch Zeilenumbrüche. Es sei denn, Sie meinen, es enthält buchstäblich die 4 Zeichen "Backslash r Backslash n". –

+0

Die Zeile ist eine Antwort einer Curl-Anfrage an einen Server, und der Server antwortet mit einem json mit \ r \ n Werten (was dumm ist ... aber ich habe keine Kontrolle darüber, ich versuche es einfach um die Antwort zu analysieren ...) – user2702566

Verwandte Themen