[gelöst] sed: Leerzeichen am Zeilenanfang ersetzen...

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
detix
Beiträge: 1743
Registriert: 07.02.2007 18:51:28
Wohnort: MK

[gelöst] sed: Leerzeichen am Zeilenanfang ersetzen...

Beitrag von detix » 17.03.2008 18:38:44

...und nur dort, aber Zeichen für Zeichen (wg. Formartierung html/bbcode), aus

Code: Alles auswählen

blabla
  blabla
    blabla
soll z.B. werden

Code: Alles auswählen

blabla
LLblabla
LLLLblabla
L steht für 'und#160;' oder sowas, ein erzwungenes Leerzeichen eben.
Der einfachste Weg wäre:
sed -e 's/ /LL/g' Datei
Das greift aber nicht, wenn in der Zeile noch weitere doppelte Leerzeichen vorkommen,
und das kann ich leider nicht ausschließen...
Zuletzt geändert von detix am 18.03.2008 19:55:26, insgesamt 1-mal geändert.
Gruß an alle Debianer, und immer daran denken:
Macht ohne Haftung funktioniert nicht!

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Beitrag von Duff » 17.03.2008 19:14:41

Wenn "nur" die Leerzeichen am Anfang der Datei entfernt werden sollen, kannst du es so machen.

Code: Alles auswählen

daniel@daniel-laptop:/tmp$ cat test
blabla  blablabla blabla
  blabla blabla         blabla
      blabla                            blabla
daniel@daniel-laptop:/tmp$ sed -ne 's/[\t| ]*//p' test
blabla  blablabla blabla
blabla blabla           blabla
blabla                          blabla
Oh, yeah!

Benutzeravatar
detix
Beiträge: 1743
Registriert: 07.02.2007 18:51:28
Wohnort: MK

Beitrag von detix » 17.03.2008 19:55:58

Das ist nicht das was ich will, schau dir das Beispiel nochmal an,
die Formatierung am Zeilenanfang geht verloren.

Ich möchte jedes einzelne Leerzeichen am Zeilenanfang,
bis ein anderes Zeichen kommt durch L ersetzen
und nicht alle durch ein einziges L.

Vergesst bitte den Satz "L steht für 'und#160..."
Gruß an alle Debianer, und immer daran denken:
Macht ohne Haftung funktioniert nicht!

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 17.03.2008 21:59:28

so ?

Code: Alles auswählen

gms@gms1 ~ $ cat x.txt
bla
  blabla
    blabla
  bla bla
gms@gms1 ~ $ perl -pe '$_="L"x length($1)."$2\n" if /^( *)([^ ].*)?$/; ' x.txt
bla
LLblabla
LLLLblabla
LLbla bla
Gruß
gms

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Beitrag von Duff » 18.03.2008 08:36:09

Sollte in perl doch auch mit
\s
Zwischenraum ("whitespace")
funktionieren.
Oh, yeah!

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 18.03.2008 09:30:43

Duff hat geschrieben:Sollte in perl doch auch mit
\s
Zwischenraum ("whitespace")
funktioniert auch, was hätte das hier aber für Vorteile ?

Benutzeravatar
finupsen
Beiträge: 1327
Registriert: 21.04.2004 20:07:05
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Dortmund
Kontaktdaten:

Beitrag von finupsen » 18.03.2008 12:32:19

Geht das nicht auch mit sed ?

ich mein ich hatte mal was gelsen, das auch sowas in der art geht :

Code: Alles auswählen

 s/    n=count(^[\ ]*)   ([^\ ].*)/   n*L  \2  /
Ist nur ein beispiel, das obige wird so nicht funktionieren. Es geht nur darum ob sed in der lage ist
matches auch zu zählen...
Niemand hat vor eine zentrale Datensammelbehörde aufzubauen. Es handelt sich vielmehr um dezentrale IT-Systeme die miteinander vernetzt werden.
... und Wasser ist naß.

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 18.03.2008 13:00:04

finupsen hat geschrieben:Geht das nicht auch mit sed ?
klar doch, zum Beispiel einfach von hinten ersetzen:

Code: Alles auswählen

gms@gms2 ~ $ cat x.txt
bla
  bla bla
    bla bla bla
gms@gms2 ~ $ sed -e ':x s/^\( *\) \(.*\)$/\1L\2/; t x' x.txt
bla
LLbla bla
LLLLbla bla bla
Gruß
gms

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Beitrag von Duff » 18.03.2008 14:09:30

Nicht schlecht.

Wie würde man es denn für alle Leerzeichen machen?
Oh, yeah!

Benutzeravatar
finupsen
Beiträge: 1327
Registriert: 21.04.2004 20:07:05
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Dortmund
Kontaktdaten:

Beitrag von finupsen » 18.03.2008 16:54:09

gms hat geschrieben: klar doch, zum Beispiel einfach von hinten ersetzen:

Code: Alles auswählen

gms@gms2 ~ $ sed -e ':x s/^\( *\) \(.*\)$/\1L\2/; t x' x.txt
Ja auch gut - nice nice ;)
Aber zählen, wie schauts damit ?

@Duff
> Wie würde man es denn für alle Leerzeichen machen?

Code: Alles auswählen

sed -e 's/\ /L/g'
Niemand hat vor eine zentrale Datensammelbehörde aufzubauen. Es handelt sich vielmehr um dezentrale IT-Systeme die miteinander vernetzt werden.
... und Wasser ist naß.

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Beitrag von Duff » 18.03.2008 18:53:26

Oh mann...

Und ich war immer bei sowas dran

Code: Alles auswählen

sed -e 's/\ */L/g' datei
und habe mich über dessen Ausgabe gewundert.
Oh, yeah!

Benutzeravatar
detix
Beiträge: 1743
Registriert: 07.02.2007 18:51:28
Wohnort: MK

Beitrag von detix » 18.03.2008 19:53:57

Genial, sowohl die Perl wie auch die sed Lösung funktionieren beide perfekt.
Herzlichen Dank gms und euch allen

Hab mich für die sed Lösung entschieden und gleich ein wenig rumexperimentiert,
die 2te Gruppe und Referenz kann sogar komplett entfallen
und bringt mir auch das gewünschte Ergebnis:

Code: Alles auswählen

sed -e ':x s/^\( *\) /\1L/;tx' x.txt
Gruß an alle Debianer, und immer daran denken:
Macht ohne Haftung funktioniert nicht!

Antworten