Forum: PC Hard- und Software Wie kann man in vim jeweils ein Leerzeichen von Zeile n bis m auf einmal einfügen?


von Nano (Gast)


Lesenswert?

Ich nutze vim in der Regel nicht, bin da also nicht fit drin.

Jetzt möchte ich, wie in der Überschrift angegeben, eine Datei 
bearbeiten, für die vim eventuell hilfreich sein könnte.

Könnte mir jemand sagen, was für ein Kommando man in vim eingeben muss, 
um die obige Aufgabe durchzuführen?

Sagen wir mal n ist 120 und m ist Zeilennummer 180.

von Hmmm (Gast)


Lesenswert?

1
:120,180s/^/ /g

von Nano (Gast)


Lesenswert?

Hmmm schrieb:
> :120,180s/^/ /g

Besten Dank. Das hat wunderbar geklappt.

Jetzt würde mich noch interessieren, was die einzelnen Abschnitte 
bedeuten:
Also
"s"
"/^"
"/ " ich schätze mal, das baut das einzufügende Zeichen ein, in dem Fall 
ein Leerzeichen.
"/g"

von Hmmm (Gast)


Lesenswert?

Nano schrieb:
> Jetzt würde mich noch interessieren, was die einzelnen Abschnitte
> bedeuten:
> Also
> "s"

Search.

> "/^"

/ beginnt die zu suchende Regular Expression, ^ ist der Zeilenanfang. 
Mit $ kannst Du übrigens das Zeilenende matchen.

> "/ " ich schätze mal, das baut das einzufügende Zeichen ein, in dem Fall
> ein Leerzeichen.

Genau.

> "/g"

Global, also nicht nur den ersten Match ersetzen.

von (prx) A. K. (prx)


Lesenswert?

Hmmm schrieb:
> Global, also nicht nur den ersten Match ersetzen.

Was bei ^ am Anfang vom Pattern zwar nicht schadet, aber sinnfrei ist.

von ThomasW (Gast)


Lesenswert?

(prx) A. K. schrieb:
> Hmmm schrieb:
> Global, also nicht nur den ersten Match ersetzen.
>
> Was bei ^ am Anfang vom Pattern zwar nicht schadet, aber sinnfrei ist.

Nö, denn er soll ja in allen Zeilen ein Leerzeichen einfügen. Ohne g 
macht er das mMn nur beim ersten Treffer.

von Hmmm (Gast)


Lesenswert?

(prx) A. K. schrieb:
> Was bei ^ am Anfang vom Pattern zwar nicht schadet, aber sinnfrei ist.

Stimmt, in Fällen, wo es nur einen Match geben kann, ist das 
überflüssig. Ich hänge es nur aus Gewohnheit immer mit dran.

von (prx) A. K. (prx)


Lesenswert?

ThomasW schrieb:
> Nö, denn er soll ja in allen Zeilen ein Leerzeichen einfügen. Ohne g
> macht er das mMn nur beim ersten Treffer.

Das betrifft nur mehrere Matches innerhalb der Zeile.

von ThomasW (Gast)


Lesenswert?

(prx) A. K. schrieb:
> ThomasW schrieb:
> Nö, denn er soll ja in allen Zeilen ein Leerzeichen einfügen. Ohne g
> macht er das mMn nur beim ersten Treffer.
>
> Das betrifft nur mehrere Matches innerhalb der Zeile.

Jaja, zeilenorientierter Editor ... haste wohl Recht!

von Nano (Gast)


Lesenswert?

Hmmm schrieb:
>> "s"
>
> Search.
>
>> "/^"
>
> / beginnt die zu suchende Regular Expression, ^ ist der Zeilenanfang.
> Mit $ kannst Du übrigens das Zeilenende matchen.
>
> ...
>
>> "/g"
>
> Global, also nicht nur den ersten Match ersetzen.

Danke.

von Alexander S. (alesi)


Lesenswert?

Nano schrieb:
> Ich nutze vim in der Regel nicht, bin da also nicht fit drin.
>
> Jetzt möchte ich, wie in der Überschrift angegeben, eine Datei
> bearbeiten, für die vim eventuell hilfreich sein könnte.

Wenn du die Datei nicht auch noch editieren willst und 'sed' installiert 
ist, kannst du auch
1
sed '120,180 s/^/ /' datei.txt
verwenden.

von Jemand (Gast)


Lesenswert?

Ich hätte vermutlich
1
120,180g/.\+/:norm I <CR>
genommen; das <CR> ist als „Enter drücken“ zu verstehen.

Im Unterschied zu dem Ansatz oben, werden hier keine Leerzeichen an den 
Anfang leerer Zeilen hinzugefügt. Könnte man mit der Variante oben 
natürlich auch verhindern.

von Hmmm (Gast)


Lesenswert?

Jemand schrieb:
> Im Unterschied zu dem Ansatz oben, werden hier keine Leerzeichen an den
> Anfang leerer Zeilen hinzugefügt. Könnte man mit der Variante oben
> natürlich auch verhindern.

Ja, sogar recht kompakt, z.B. so:
1
:120,180s/^./ &/

von (prx) A. K. (prx)


Lesenswert?

Der Vollständigkeit halber wäre da noch an sed's -i erinnert, mit dem 
das File in-place modifiziert wird.

von Nano (Gast)


Lesenswert?

Jemand schrieb:
> Ich hätte vermutlich
>
1
120,180g/.\+/:norm I <CR>
> genommen; das <CR> ist als „Enter drücken“ zu verstehen.
>
> Im Unterschied zu dem Ansatz oben, werden hier keine Leerzeichen an den
> Anfang leerer Zeilen hinzugefügt. Könnte man mit der Variante oben
> natürlich auch verhindern.

Mein Editor den ich normalerweise benutze entfernt die Leerzeichen am 
Ende einer Zeile automatisch.

von Jemand (Gast)


Lesenswert?

TIL about & in Ersetzungen :) ([code]:h sub-replace-special[\code])

von Rolf M. (rmagnus)


Lesenswert?

Hmmm schrieb:
> Nano schrieb:
>> Jetzt würde mich noch interessieren, was die einzelnen Abschnitte
>> bedeuten:
>> Also
>> "s"
>
> Search.

Eigentlich substitute.

>> "/^"
>
> / beginnt die zu suchende Regular Expression,

Man kann dafür übrigens nicht nur /, sondern jedes beliebige 
Sonderzeichen verwenden. Also s.^. . hätte die gleiche Wirkung.

Übrigens hat vim auch eine Hilfe. Mit :help :s bekommt man die zum 
subistitue-Kommando.

Nano schrieb:
> Mein Editor den ich normalerweise benutze entfernt die Leerzeichen am
> Ende einer Zeile automatisch.

Meiner pfuscht mir nicht in den Text rein, wenn ich ihm nicht sage, dass 
er das soll. Ich könnte das natürlich so einrichten, dass er das macht, 
aber das will ich gar nicht. Das macht sich beim Einchecken ins Repo 
nicht so gut, wenn der Editor einfach unkontrolliert Dinge verändert.

von Nano (Gast)


Lesenswert?

Rolf M. schrieb:
> Nano schrieb:
>> Mein Editor den ich normalerweise benutze entfernt die Leerzeichen am
>> Ende einer Zeile automatisch.
>
> Meiner pfuscht mir nicht in den Text rein, wenn ich ihm nicht sage, dass
> er das soll.

Er pfuscht mir nicht rein, ich habe ihn so eingestellt, damit er genau 
das macht.

Ich hatte jedenfalls noch nie eine Datei, bei der ich dringend 
Leerzeichen am Ende benötigen würde. Mir ist auch kein textbasiertes 
Dateiformat bekannt, das auf so etwas angewiesen ist.

> Ich könnte das natürlich so einrichten, dass er das macht,

Aha.

> Das macht sich beim Einchecken ins Repo
> nicht so gut, wenn der Editor einfach unkontrolliert Dinge verändert.

Das Repo verändert selber Dinge.
Kannst ja mal nen Text mit CRLF in ein git Repo einfügen, wenn das 
richtig eingestellt ist, dann wird das CR entfernt.

von Hmmm (Gast)


Lesenswert?

Nano schrieb:
> Ich hatte jedenfalls noch nie eine Datei, bei der ich dringend
> Leerzeichen am Ende benötigen würde. Mir ist auch kein textbasiertes
> Dateiformat bekannt, das auf so etwas angewiesen ist.

Einen gängigen Anwendungsfall gibt es, nämlich Signaturen von Mails und 
Usenet-Postings:

https://en.wikipedia.org/wiki/Signature_block#Standard_delimiter

Bei Quoted-Printable-Encoding ist das Leerzeichen allerdings in der Mail 
nicht mehr in nackter Form vorhanden.

von Nano (Gast)


Lesenswert?

Für Mails nutze ich mein E-Mail Programm, das hat nen eigenen Editor.

von Rolf M. (rmagnus)


Lesenswert?

Nano schrieb:
>> Das macht sich beim Einchecken ins Repo
>> nicht so gut, wenn der Editor einfach unkontrolliert Dinge verändert.
>
> Das Repo verändert selber Dinge.
> Kannst ja mal nen Text mit CRLF in ein git Repo einfügen, wenn das
> richtig eingestellt ist, dann wird das CR entfernt.

Es passt es halt an das jeweilige System an, wenn man das möchte. Aber 
das wird intern gemacht. Dazu wird nicht jedesmal eine Änderung draus 
gemacht. Wenn der Editor da aber Zeilenenden verändert, müllt mir das 
den Commit im Repo zu.

Nano schrieb:
> Für Mails nutze ich mein E-Mail Programm, das hat nen eigenen Editor.

Das tue ich auch. Früher habe ich in der Firma Outlook als Mail- und 
Usenet-Programm nutzen müssen. Dessen Editor entfernt auch ungefragt 
Leerzeichen von den Zeilenenden und macht damit den Signaturtrenner 
kaputt - natürlich nicht abschaltbar.

von Jemand (Gast)


Lesenswert?

Rolf M. schrieb:
> Wenn der Editor da aber Zeilenenden verändert, müllt mir das den Commit
> im Repo zu.

lrn2git

von Lerninstructor (Gast)


Lesenswert?

Hmmm schrieb:

>> Jetzt würde mich noch interessieren, was die einzelnen Abschnitte
>> bedeuten:
>> Also
>> "s"
>
> Search.

Nope, substitute wäre korrekt als Erklärung für 's'
https://man7.org/linux/man-pages/man1/vi.1p.html

Suchen ist '?' oder '/' .

von Hmmm (Gast)


Lesenswert?

Rolf M. schrieb:
> Eigentlich substitute.

Lerninstructor schrieb:
> Nope, substitute wäre korrekt als Erklärung für 's'

Stimmt, mea culpa!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.