verschieben, um den Rest der Zeile zu einer Neuen-Zeile nach einem Leerzeichen

stimmen
1

wenn ich die folgenden:

>AB ABABABA
>AC ACACACA

wie kann ich alles auf eine neue Zeile nach dem Raum, dh verschieben

>AB
ABABABABA
>AC
ACACACACA

Ich habe versucht:

cat file | sed 's/ /\n/g'
cat file | tr ' ' '\n'

jedoch bekomme ich genau die gleiche Ausgabe.

** UPDATE **

Auf die Datei Inspektion weniger und nano verwendet, war der Ausgang anders Katze mit. Die Datei enthält einige Terminal Escape-Zeichen, die in Katze nicht angezeigt werden, sondern sind in weniger. (Wie geschieht das auch?)

Das war ein schrecklicher Fehler zu erkennen und jeder hat tatsächlich korrigiert Antworten gepostet basierend auf der Ausgabe der Katze. Also vielen Dank für Ihre Hilfe. Könnten die Mods diese eine in der Nähe?

Veröffentlicht am 02/12/2016 um 22:32
quelle vom benutzer
In anderen Sprachen...                            


4 antworten

stimmen
2

Bei näherem Hinsehen sieht es aus wie Sie das erste Wort in der nächsten Zeile wiederholt werden sollen: zu transformieren diese

>foo bar
>baz qux

das mögen

>foo
foobar
>baz
bazqux

Wenn das stimmt, können Sie tun

sed -r 's/^>([^ ]+) />\1\n\1/' file  # or
perl -pe 's/^>(\S+) />$1\n$1/' file
Beantwortet am 03/12/2016 um 15:25
quelle vom benutzer

stimmen
2

Es scheint, dass Sie (jede Art von) Raum mit einem Newline ersetzen müssen

perl -pe 's/\s+/\n/' data.txt

Dadurch ergibt sich die erforderliche Leistung in meinen Tests. Die -prichten die Schleife über Eingang (Dateien oder unter Verwendung öffnen STDINund Sätze) $_zu der aktuellen Zeile. Er druckt auch $_jedes Mal nach der Verarbeitung.

Wenn es mehrere Räume sind, die jeweils durch ersetzt werden \n, fügen Sie /gModifikator.

Wenn es mehr sein kann tun Sie auch Muster erfassen und sie ersetzen

perl -pe 's/\s+(.*)/\n$1/' data.txt

Im Anschluss an der Beobachtung in der Antwort von glenn jackman und auf der Suche „ enger “ es scheint , dass das erste Wort in der Zeile muss in der nächsten Zeile kopiert werden. Dann wird die obige modifiziert

perl -pe 's/^>(\S+)\K\s+/\n$1';

Das \Kist eine besondere Form des positiven Lookbehind , die behauptet , dass das Muster der aktuellen Spiel Position vorausgeht , aber es wirft alle vorherigen Matches (so dass Sie nicht erfassen müssen und kopieren Sie sie). Sie können es finden in perlre . Ohne sie das >(\S+)würde verbraucht , so wäre es im Ersatzteil werden muß zurückkopiert, wie />$1\n$1/.

Beantwortet am 03/12/2016 um 01:21
quelle vom benutzer

stimmen
2

Versuchen Sie, auch den Inhalt aus der Zeit vor dem Raum auf der nächsten Zeile zu bewegen?

Wie in >A BCwird:

>A
ABC

Dann kann man wie folgt verwenden sed:

$ sed 'h;s/^>\([^ ]*\) /\1/;x;s/ .*/ /;G' file
>AB 
ABABABABA
>AC 
ACACACACA

Nervenzusammenbruch:

h;                                # Copy pattern space to hold buffer
  s/^>\([^ ]*\) /\1/;             # Convert >A BC to ABC 
                     x;           # eXchange hold buffer and pattern space
                       s/ .*/ /;  # Remove everything after, but including the
                                  # first space: >A BC -> >A
                                G # Append hold buffer to pattern space
Beantwortet am 02/12/2016 um 22:41
quelle vom benutzer

stimmen
1

sed für einfache Substitutionen an einzelnen Linien ist, das ist alles. Für alles andere sollten Sie awk werden, zB:

$ awk '{print $1 ORS substr($1,2) $2}' file
>AB
ABABABABA
>AC
ACACACACA
Beantwortet am 03/12/2016 um 14:37
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more