Hogyan adhatunk állandó sorszámokat egy fájlhoz?

Van ilyen szövegfájlom (a gVim használatával Windows rendszeren)

foo bar baz quux corge grault garply waldo fred plugh [...150 more lines...] xyzzy thud 

Számot szeretnék hozzáadni a fájl minden sorához. Nem a :set number funkciót használja, hanem a számot minden sor előtt megelőző szövegként adja hozzá, az alábbiak szerint, így a szám a fájl része.

1. foo bar baz quux 2. corge grault garply 3. waldo fred plugh [...~150 more lines...] 155. xyzzy thud 

Megjegyzések

  • awk valószínűleg ennek a feladatnak az eszköze. De ‘ m Windows-on (sóhajtok).
  • Már itt válaszoltam , nem gond 🙂
  • Talán .. Vagy ez általánosabb?
  • Ez ‘ hasonló, de én nem szeretnék ‘ nem tudja, mi az állandó sorszám. Másodszor, a másik kérdés kifejezetten a gVim összes sorára vonatkozik (és a válasz is ezt teszi) a Windows rendszeren, és ez csak egy bekezdéshez tartozó egyszerű sorszámozott lista csak sima vim-ben.
  • Nos, azt hiszem, hogy a bejegyzés ” permanent ” ot jelzi, hogy a puffert módosítani kell, és hogy a számok nem ‘ t valami tisztán vizuális dolog (ugyanaz, mint te). A gvim megadásának oka a Windows rendszerben az, hogy kerülje a külső segédprogramokat, például cat vagy nl, amelyek képesek megadni a sorokat, de nem = “3ab99f7668”>

nem érhető el általában a Windows rendszeren (ahogy az OP aawk-re vonatkozó megjegyzésükből kitűnik). A két legfontosabb megoldás tiszta Vim. Végül az összes vonal és egy para csak a tartomány kiválasztásának kérdése. Nyilvánvalóan nem nagy kérdés.

Válasz

Tiszta Vim módra:

:%s/^/\=line(".").". " 

Magyarázat:

:%s/^/ " the substitution will be applied to the beginning of every line \= " the rest of the replacement part is an expression line(".").". " " the expression returns the current line number concatenated with a dot and a space 

Lásd: :help \= és :help line().

Egy kifejezés használata a pótalkatrészben nagyon hatékony és az FWIW nagyon jó belépési pont a vimscript-hez.

Megjegyzések

  • Hogyan adhatom hozzá ezt a nagyon hasznos parancsot a vimrc billentyűsávjához?
  • A vim súgótémához való hozzáféréshez: :help sub-replace-expression

Válasz

A Vim makrók egyik szép tulajdonsága, hogy visszatérhetnek (meghívhatják magukat) ):

  1. A q regisztráció törlése: qqq
  2. Adja hozzá a számot az első sorhoz: ggI1. (ne felejtse el a szóközt!)
  3. Lépjen vissza a sor elejére, és kezdjen el makrót rögzíteni: 0qq
  4. Másolja a számot:
  5. Mozgasson lefelé egy sort, és illessze be a számot: +P
  6. lépjen vissza a sor elejére és növelje a számot: 0<c-a>
  7. Lépjen vissza a sor elejére (tehát a makró nem törik el, ha kétszeres számra kerül!): 0
  8. Hívja meg egyszer a makrót, hogy rekurzív legyen. Ezen a ponton még mindig nincs semmi a q regiszterben, így semmi sem fog történni: @q.
  9. Mentse a makrót: q
  10. Hívja még egyszer a makrót, és figyelje a szikrák repülését !: @@

A makró ezután folytassa önmagának meghívását, amíg el nem éri a fájl végét.

A rekurzív makrót sok más hasonló problémára is használhatja, ezért jó, ha tisztában van vele.

Ha valamilyen oknál fogva nem akar rekurzív makrót használni, akkor kihagyhatja az 1. és a 8. lépést, és egy count használatával futtathatja a makrót többször, pl. A 100@q százszor futtatja a q makrót.

Megjegyzések

  • Hatalmas dolgok, meghajolok mesterkedése előtt. A makrók nekem olyanok, mint a fekete mágia …
  • @ropata, a makró csak (főleg) normál módú parancsok sorozata.
  • @romainl szerintem ‘ jobb, ha a billentyűleütések sorozataként gondolkodunk róla.
  • @Rich, ez sok mindenből állhat, beleértve az ex parancsokat is.
  • @romainl Igen, ezért ‘ ezért gondolom, hogy ‘ az a legjobb, ha billentyűleütésekként gondolunk rá. Pontosan azt játssza le, amit beír a billentyűzetre (beleértve, ahogy mondani szokta, az ex parancsokat), mintha kézzel írta volna be az egészet.

Válasz

Szeretem a vim globális parancsot használni az ilyen feladatok végrehajtására. Ez vonatkozik az iterációnak a sor elejére történő felvételére vagy egy szimbólum módosítására a szövegben. Úgy tűnik, bonyolultabb, mint a többi megoldás, de elég rugalmas minta, amikor használható, és könnyen átgondolható sok gondolkodás nélkül.

Először válassza ki a tartományt (melyik vonalat választja) szeretnék ezt alkalmazni). Általában jelöléseket használok (pl.ma az első sorban és mb a második sorban, de használhat sorszámokat vagy vizuális kijelölést is), majd írja be a a következő parancs (jelenleg a felhasználói esethez igazítva)

:let i=1|"a,"bg/^/s/^/\=i.". "/|let i=i+1 

Dekonstrukció

:let i=1 

Ez beállítja a i változót kezdőértékkel. A listák általában 1-gyel kezdődnek, ezért az i értéket 1-re állítom.

| 

A sáv új parancsot indít

"a,"b 

Ez állítja be a következő parancs tartományát. A a jeltől a b jelölésig haladok , amely a lista első és utolsó sorára kerülne.

g/^/ 

Ez a globális parancs. Megkeresi a fájlt (vagy tartományt) egy adott reguláris kifejezés után, és végrehajtja a parancssor többi részét az illeszkedő sorok mindegyikén . Minden sort megegyezek a “sor elejére” kereséssel. Ha olyan szövege volt, mint

Item some txt other text Item second item whatever Item third 

, és ezeket a címkéket csak a Item és hagyja figyelmen kívül a többi sort, tegye helyette g/Item/ vagy g/^Item/ (feltételezve a szó szerinti elem szövegét )

s/^/\=i.". "/ 

Ez végrehajtja a reguláris kifejezést, amely a sor elejét lecseréli a i összefűzött értékre. a .. Általában ezt bármire megteheti (cserélje le például a Item címkét a számmal).

|let i=i+1 

Annak ellenére, hogy a sáv új parancsot indít, beállít egy második parancsot, amely a globális parancson belül fut, nem pedig a globális befejezése után. Ennek eredményeként növekszünk i mielőtt a következő sort feldolgozza g. Itt van egy másik lehetőség a rugalmasságra. Az i módosítása bármi lehet (incre 2-vel hívjon meg egy olyan függvényt, amely a Fibonacci szekvencia következő elemét generálja, bármi is legyen).

Válasz

Számok hozzáadása a minden sor

Lehetséges a :%!nl -ba vagy :%!cat -n parancsok, amelyek sorszámokat adnak az összes sorhoz.

Windows rendszeren “telepítve van a Cygwin / MSYS / SUA.

Számok hozzáadása a kijelölt sorokhoz

Ha csak a kiválasztott sorokhoz kíván hozzáadni számokat, válassza ki őket vizuális mód ( v és kurzorok), majd ha elkészült, hajtsa végre a következő parancsot: :%!nl (az üres sorok figyelmen kívül hagyása) vagy :%!cat -n (üres sorokat is tartalmaz).

Formázás

További szóközök eltávolításához válassza ki őket a vizuális blokkban ( Ctrl + v ), és távolítsa el őket ( x ).

Néhány karakter hozzáadásához (., :, ) a számok után jelölje ki őket a vizuális blokkban ( Ctrl + v ), majd csatolja a karaktert ( A , írja be a karaktert, majd fejezze be az Esc ) kifejezést.

Megjegyzések

  • Ez nem adja meg a megadott formázást a kérdésben. Szeretem azonban a megoldás egyszerűségét.
  • @KarlYngveLerv å g Köszönöm, ezt is belefoglalta a válaszba.

Válasz

A romainl “válaszának módosítása :

:%s/^\(\d\+\. \)\?/\=line(".").". " 

Ez nem csak felvesz sorszámokat, hanem lecseréli a kilépő sorszámokat is, ha már ott vannak. Ha egy sort beillesztettél félúton, akkor az a vártnak megfelelően mindent újraszámoz.

Ez úgy működik, hogy bármely számot egy a. És egy sor elején levő szó helyettesít egy új számmal. . Ez nyilvánvalóan megszakad, ha van olyan sora, amely már ezzel a mintával kezdődik, ezért gondolattal használja.

A hozzáadott rész:

  • ^ – a sor kezdete
  • \( – Új alcsoport indítása
  • \d\+ – Egy számjegy egyeztetése legalább egyszer
  • \. – Pont illesztése (.) és egy szóköz .
  • \) – Alcsoport befejezése
  • \? – Tedd opcionálisá a csoportot, hogy úgy működjön, mint korábban, ha még nincs szám ezen a soron.

Bónusztipp :
A sorszámok eltávolításához ugyanazt a mintát használhatja üres válaszrésszel:

:%s/^\(\d\+\. \)\?// 

Válasz

I1. <esc>^qqyWjP^<C-a>q 

Ez számolja az első két sort, és megnyomhatja a @q a következő sorok számozásához (vagy írja be az ex. 18@q ha összesen 20 sort akarsz megszámolni).

Magyarázat:

I1. <esc> Number the first line hqq Go back to the start of the line and start recording a macro yWjP Copy the line number to the next line ^<C-a> Increment the next line"s line number q Finish recording 

Ennek előnye, hogy nem igényel külső parancsokat, ami akkor hasznos, ha újra például a Vim használatával Windows rendszeren.

Megjegyzések

  • A 1. <esc>h beírása után a második oszlop, nem első oszlop. A h szöveget lecserélném a 0 kifejezésre, ami után szerintem nagyon jó megoldásnak kell lennie.
  • @KarlYngveLerv å g Hoppá, ez elírás volt. Köszönöm, kijavítottam.
  • Semmi gond. Azonban még mindig nem frissítette a magyarázatot. Továbbá: Sok billentyűzeten a ^ egy második karakterre vár, hogy lehetővé tegye a gépelési kombinációkat, mint például a ^a -> â. Még mindig egyetértek a legjobb megoldással, de úgy gondolom, hogy ezt is meg kell említeni.

Válasz

I úgy gondolom, hogy a kiválasztott válasz a legjobb, de a változatosság ellenére alternatívát kínálok egy külső program használatával:

:%!cat -n 

Ez az egészet szűri puffer (% jelöléssel) a külső programon keresztül, cat, ahol a -n A flag minden bemeneti sort előkészít egy sorszámmal.

Ehhez természetesen megkövetel cat telepítést, ami (valószínűleg) az összes Unix-ra igaz típusú rendszerek.

A :help :range! oldalon talál további információt a külső programok szűréséről.

Megjegyzések

  • Tudomásul veszem, hogy a kérdező a gVim-et használja a Windows rendszeren, így ez a megoldás valószínűleg nem fog ‘ t működni ott. Azt hiszem azonban, hogy még mindig ad némi lehetőséget másoknak t o tanuljon belőle.
  • Ha ‘ telepítette a msysgit alkalmazást, és hozzáadta a PATH-hoz (IIRC it ‘ s telepítési opció), ennek a megoldásnak működnie kell a Windows rendszeren is.
  • nem POSIX, de nl az, tehát lehet, hogy jobb megoldás.

Válasz

Egy kicsit feltörő megoldás a következő lehet (minden, ami a < és> be kell illeszteni a Ctrl + v ) megnyomása után:

:%normal :redir @"<Enter>:-=<Enter>:redir END<Enter>I<C-R>".<Tab><Esc>kdd 

Dekonstrukció

:%normal {commands} 

a normál mód parancsot futtatja a tartomány által megadott minden soron, ebben az esetben minden soron

:redir @" 

az ex parancsokkal készített összes kimenetet átirányítja a meg nem nevezett pufferbe.

:.= 

egy ex parancs, amely az aktuális sort adja ki szám (sajnos megelőző új vonallal)

:redir END 

abbahagyja az átirányítást a meg nem nevezett pufferbe

I<C-R>".<Tab><Esc> 

beszúrja a meg nem nevezett puffer tartalmát a-val. és egy tabulátorral az egyes sorok elejére, és kilép az beszúrási módból.

kdd 

egy sort felfelé halad és eltávolítja az új sort, amely a következők eredménye:. = parancs.

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük