2017-06-27 2 views
3

Ich habe ein Dokument, dessen Zeilen durch "\ t \ n" getrennt sind. Datensätze werden entweder durch "\ t" oder durch "\ n" getrennt.So begrenzen Sie Datei mit " t n" auf einem Mac

Normalerweise sollte dies eine straigtforward awk Abfrage sein:

BEGIN { 
    RS='\t\n'; 
} 
{ 
    print; 
    print "Next entry:"; 
} 

jedoch auf einem Mac, nicht reguläre Ausdrücke scheinen unterstützt werden (? Vielleicht richtig ich mache etwas nicht) Also habe ich versucht, ; Dies wird jedoch als RS='\t | \n' interpretiert. Ähnliche Probleme awk von der Kommandozeile ausgeführt wird:

awk 1 RS='\t\n' ORS='abc' input > output 

ersetzt die \t 's, läßt aber die \n' s sein.

Nächster Versuch: mit tr. Dies schlägt offensichtlich bei einer Sequenz von mehr als einem Zeichen fehl - da \t und \n beide einzeln in den Zeilen verwendet werden.

Next:

sed -e '/\t\n/s//NextEntry:/g' input > output 

jedoch nicht funktioniert. Die Eingabe einer beliebigen ASCII-Zeichenfolge anstelle von \ t \ n funktioniert.

Lesen Sie das Handbuch. Es besagt, dass \t in sed-Strings nicht unterstützt wird. Fair genug

sed -e '/\x9\xa/s//abc/' input > output 

Funktioniert immer noch nicht. Idee: Verwenden Sie tr, um \t und \n durch Zeichen zu ersetzen, die in der Eingabedatei unbenutzt sind, verwenden Sie sed, um sie zu ändern, was ich will, und dann tr, um die restlichen Zeichen zurück zu ändern, was sie sein sollten.

tr: Illegal byte sequence 

Es stellte sich heraus, dass f6 Charakter macht tr einfach total fehl.

Ging durch die Vorschläge in Sed not recognizing \t instead it is treating it as 't' why?. Das könnte funktionieren, um Ausgabezeichenfolgen zu ersetzen (mit Ausnahme der "Einfügen-Registerkarte in Eingabeaufforderung über STRG + V" Vorschlag - die Shell nur diese Paste zurückgewiesen.), Schien aber nicht in meinem Fall zu helfen.

Vielleicht liegt es daran, dass es ein Mac ist? Vielleicht liegt es daran, dass das der gesuchte Text ist, den ich nicht ersetzen möchte? Vielleicht ist es die Kombination mit \n?

Haben Sie noch weitere Vorschläge?

UPDATE:

fand ich Thread How can I replace a newline (\n) using sed?. Anscheinend bin ich nicht in der Lage, eine \n durch die Schnur "abc" unter Verwendung der Vorschläge in diesem Faden sogar zu ersetzen.

EDIT: Hex Leiter der Quelldatei:

5a 20 4e 4f 09 0a 41 53 20 4f 46 20 30 31 2d 30 
34 2d 30 35 20 45 4d 50 4c 4f 59 45 45 0a 47 52 
4f 55 50 09 48 49 52 45 20 44 41 54 45 09 53 41 
4c 41 52 59 09 4a 4f 42 20 54 49 54 4c 45 09 0a 
4a 4f 42 20 4c 45 56 45 4c 0a 53 45 52 49 45 53 
09 41 50 50 54 20 54 59 50 45 09 0a 50 41 59 20 
53 54 41 54 55 53 0a f6 
+0

Können Sie bitte eine Kopie Ihrer * "unglücklichen" * Datei bereitstellen? –

+0

@MarkSetchell OK, ich habe den Kopf hochgeladen. – Alex

Antwort

3

Leider BSD awk, als auch auf macOS verwendet wird, nicht unterstützt Mehrzeichen Satztrenn (RS) insgesamt (im Einklang mit POSIX) - nur ein einzelnes, literales Zeichen wird unterstützt.

BSD sed, als auch auf macOS verwendet, unterstützt nur\n in Regexes - sonstige entkommt, einschließlich hex Einsen (z.B. \x09) sind nicht unterstützt.
Siehe this answer von mir für einen umfassenden Vergleich von GNU und BSD sed.

Unter der Annahme, dass Ihre sed Befehl funktioniert im Prinzip Sie ein verwenden können ANSI C-quoted string ($'\t') einen wörtlichen Registerkarte char Spleiß. in Ihr sed Skript (übernimmt bash (die macOS Standard-Shell), ksh oder zsh) ,:

sed -e ':a' -e '$!{N;ba' -e '}' -e '/'$'\t''\n/s//NextEntry:/g' 

Beachten Sie, dass, um neue Zeilen zu ersetzen, Sie sed anweisen, muss die gesamte Datei in den Speicher zu lesen, zuerst , was ist -e ':a' -e '$!{N;ba' -e '}' tut (die BSD Sed-kompatible Form der gemeinsamen GNU sed idiom :a;$!{N;ba}).

Verwandte Themen