staging.inyokaproject.org

Text formatieren mit SED oder AWK oder ...

Status: Ungelöst | Ubuntu-Version: Ubuntu MATE 16.04 (Xenial Xerus)
Antworten |

ichbinratlos

Anmeldungsdatum:
22. Januar 2017

Beiträge: 8

Hallo ihr,

ich hätte gerne einen text formatiert und komme beim besten Willen nicht weiter.

Dieser sieht so oder so ähnlich aus:

^[(B^[[0;1m^[[37m^[[40mMap ^[[10G^[(B^[[0m^[[37m^[[40m^[[1K ^[(B^[[0m^[[37m^[[40m^[[K ^[(B^[[0;1m^[[37m^[[40mPlayers ^H^[(B^[[0m^[[37m^[[40m^[[1K ^[(B^[[0m^[[37m^[[40m^[[K ^[(B^[[0;1m^[[37m^[[40mWave ^[(B^[[0;1m^[[37m^[[40m0/0^M ^[(B^[[0m^[[37m^[[40m^[[K -- ^[[4GMap ^[[11Gs^[[33;4H^[[39;49m^[(B^[[m^M^[[51d^[(B^[[0;1m^[[33m^[[4 ^[[37m^[[40m^[[J^[[39;49m^[(B^[[m^[[53;1H^[[?1049l^M^[[?1l^[>

Darin befinden sich die Worte Map, Players,Wave,0/0bis5/4 und 1/6bis6/6

Folgendes Ziel müsste ich erreichen per Script das all diese Sachen danach unter einander stehen, sprich jeweils nach den suchwörtern ein Zeilenumbruch geschieht und der Quatsch danach davor gelöscht wird.

Map Players Wave 0/0bis5/4 1/6bis6/6

Map
Players
Wave
0/0bis5/4
1/6bis6/6

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11278

Meinst du sowas?

$ grep -o "Map\|Players\|Wave\|[[:digit:]]/[[:digit:]]" <<< "^[(B^[[0;1m^[[37m^[[40mMap ^[[10G^[(B^[[0m^[[37m^[[40m^[[1K ^[(B^[[0m^[[37m^[[40m^[[K ^[(B^[[0;1m^[[37m^[[40mPlayers ^H^[(B^[[0m^[[37m^[[40m^[[1K ^[(B^[[0m^[[37m^[[40m^[[K ^[(B^[[0;1m^[[37m^[[40mWave ^[(B^[[0;1m^[[37m^[[40m0/0^M ^[(B^[[0m^[[37m^[[40m^[[K -- ^[[4GMap ^[[11Gs^[[33;4H^[[39;49m^[(B^[[m^M^[[51d^[(B^[[0;1m^[[33m^[[4 ^[[37m^[[40m^[[J^[[39;49m^[(B^[[m^[[53;1H^[[?1049l^M^[[?1l^[>"
Map
Players
Wave
0/0
Map

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

seahawk1986 schrieb:

$ grep -o "Map\|Players\|Wave\|[[:digit:]]/[[:digit:]]"

Ich nehme ja lieber egrep und einfache Anführungsstriche (robuster bei Sonderzeichen in Mustern), also so:

1
egrep -o 'Map|Players|Wave|[[:digit:]]/[[:digit:]]'

Wenn nur die Ziffern 0 bis 6 auftauchen sollen, könnte man das noch zielgenauer machen. Ebenso müsste man das anpassen, wenn auch Zahlen mit mehreren Ziffern erfasst werden sollen.

Aber wo taucht da die Sache mit "bis" auf?

schusch

Avatar von schusch

Anmeldungsdatum:
2. September 2008

Beiträge: 324

Steht in deiner Datei wirklich ^[ (=zwei Zeichen), oder steht da ein Escape? Da sieht nämlich sehr nach Steuerzeichen für ein Terminal aus.

Ausgabe von

1
hd <Txtdatei

?

Wenn du ganz oft ein 1b siehst, probier mal:

1
sed 's/^[[^A-Za-z]*./ /g' <Txtdatei | sed '/^ *//' | sed 's/ */\n/g'

Wobei hier das '^[' ein Escape-Zeichen ist. Das gibst du in der Shell mit <strg-V> <esc> ein.

Kurze Erklärung:

Escape-Sequenzen fangen, wenig überraschend mit mit dem Escapezeichen an und enden mit einem Buchstaben.

Der erste sed ersetzt diese Sequenzen durch ein Leerzeichen.

Der zweite sed löscht die Leerzeichen am Anfang.

Der dritte sed ersetzt eine beliebig lange Folge von Leerzeichen durch einen Zeilenumbruch.

LG schusch

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

schusch schrieb:

1
sed 's/^[[^A-Za-z]*./ /g' <Txtdatei | sed '/^ *//' | sed 's/ */\n/g'

Da fehlt ein "s", die Eingabeumleitung ist über und man kann die drei Aufrufe auch in einen kombinieren:

1
sed 's/^[[^A-Za-z]*./ /g;s/^ *//;s/ */\n/g' Txtdatei

Wobei hier das '^[' ein Escape-Zeichen ist. Das gibst du in der Shell mit <strg-V> <esc> ein.

Kurze Erklärung:

Escape-Sequenzen fangen, wenig überraschend mit mit dem Escapezeichen an und enden mit einem Buchstaben.

Der erste sed ersetzt diese Sequenzen durch ein Leerzeichen.

Der zweite sed löscht die Leerzeichen am Anfang.

Der dritte sed ersetzt eine beliebig lange Folge von Leerzeichen durch einen Zeilenumbruch.

Leider kann diese Folge auch leer sein, weshalb das Ergebnis nicht so ausfällt, wie Du vielleicht gedacht hast:

1
2
3
4
5
6
7
8
$ echo 'foo bar' | sed 's# *#\n#g'

f
o
o
b
a
r

Vermutlich wolltest Du eher

1
2
3
$ echo 'foo bar' | sed 's# \+#\n#g'
foo
bar
Antworten |