Die optimale Wahl einer Technik stark von den tatsächlichen Umständen abhängt der Transformation. Es gibt mindestens zwei Punkte Variationen beeinflussen Umsetzung:
Ob die Linien auf den Betrieb sind die einzigen, die in einer Datei? Wenn nicht, ist der Bereich der Zeilen, die durch den Kontext definiert sind (d. H. Er wird durch leere Zeilen wie ein Absatz getrennt) oder ist er willkürlich und sollte von Benutzer angegeben werden?
Sind in diesen Zeilen bereits Zahlen enthalten, die geändert werden sollen oder ist es erforderlich, neue einzufügen, die den Text auf den Zeilen intakt lassen?
Da es keine Informationen über diese Fragen zu beantworten, unter wir konstruieren eine flexible Lösung versuchen.
Eine allgemeine Lösung ist eine Ersetzung, die am Anfang der Zeilen in dem vom Benutzer angegebenen Bereich ausgeführt wird. Der visuelle Modus ist wahrscheinlich der einfachste Weg der Auswahl eines beliebigen Bereichs von Linien, so dass wir hier annehmen, dass Grenzen von der Bereich durch die visuelle Auswahl definiert sind.
:'<,'>s/^\d\+/\=line(".")-line("''")+1/
Wenn es notwendig ist, jede Zeile in einem Puffer Nummer kann der Befehl wie folgt vereinfacht werden.
:%s/^\d\+/\=line('.')/
In jedem Fall sollte, wenn die Anzahl lediglich an den Anfängen der Zeilen eingefügt werden (ohne die, die Modifizierung, die bereits vorhanden sind), kann man das Muster von ^\d\+
zu ^
, ändern und eine wahlweise hinzuzufügen Separator:
:'<,'>s/^\d\+/\=(line(".")-line("''")+1).' '/
oder
:%s/^/\=line('.').' '/
sind.
Für eine Lösung, die auf Befehlszeilentools basiert, kann man die Verwendung von Stream Editoren wie Sed oder Textextraktions- und Berichterstellungstools wie AWK in Erwägung ziehen.
Zu jeder der Zeilen in einer Datei nummerieren Sed verwenden, die Befehle ausführen
$ sed = filename | sed 'N;s/\n/ /'
Um die gleiche in AWK zu tun, verwenden Sie den Befehl
$ awk '{print NR " " $0}' filename
die leicht modfied werden könnte um die Nummerierung auf einen bestimmten Linienbereich zu beschränken eine bestimmte Bedingung zu erfüllen. Der folgende Befehl nummeriert z. B. die Zeilen 2 bis 8 der Zeile .
$ awk '{print (2<=NR && NR<=8 ? ++n " " : "") $0}' filename
ein Interesse daran, wie Befehle ähnlich denen aus dem in die Frage Anweisung verknüpft Skript Mit umgesetzt werden, kann man den folgenden Befehl als eine Referenz verwenden.
vnoremap <leader>i :call EnumVisualBlock()<cr>
function! EnumVisualBlock() range
if visualmode() != "\<c-v>"
return
endif
let [l, r] = [virtcol("'<"), virtcol("'>")]
let [l, r] = [min([l, r]), max([l, r])]
let start = matchstr(getline("'<"), '^\d\+', col("'<")-1)
let off = start - line("'<")
let w = max(map([start, line("'>") + off], 'len("".v:val)'))
exe "'<,'>" 's/\%'.l.'v.*\%<'.(r+1).'v./'.
\ '\=printf("%'.w.'d",line(".")+off).repeat(" ",r-l+1-w)'
endfunction
Die Antwort hängt vom Umfang der Maßnahme: Ob dieser Spalte der einzige Inhalt sind in einer Datei? Oder ist es ein Absatz oder eine willkürliche Reihe von Linien? Enthalten diese Zeilen ursprünglich auch einige Zahlen (wie "1" im obigen Beispiel) oder zusätzlichen Text (oder beides)? Müssen Nummern eingefügt oder bestehende geändert werden? –
Können Sie bitte genau angeben, welche Aufgabe eine Antwort lösen soll? Welche spezifischen Anforderungen haben Sie? Möchten Sie, dass das verknüpfte Skript (oder ein bestimmter Teil seiner Funktionalität, dann angeben) in einer Antwort von Grund auf neu implementiert wird? –
Die Funktion, die ich vorgeschlagen habe, folgt nur dem Verhalten des Referenzskripts (einschließlich der Verwendung einer spaltenweisen visuellen Auswahl), da Sie * sich * noch immer * nicht genau formulieren *, welches Verhalten Sie wollen (und meine Klärungsfragen ignorieren). –