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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Nano (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
1 lesenswert
nicht lesenswert
1
:120,180s/^/ /g

von Nano (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
1 lesenswert
nicht 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)


Bewertung
2 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
2 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
1 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


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

von Rolf M. (rmagnus)


Bewertung
1 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


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

von Rolf M. (rmagnus)


Bewertung
1 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
Rolf M. schrieb:
> Eigentlich substitute.

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

Stimmt, mea culpa!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.