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
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) ):
- A q regisztráció törlése:
qqq
- Adja hozzá a számot az első sorhoz:
ggI1.
(ne felejtse el a szóközt!) - Lépjen vissza a sor elejére, és kezdjen el makrót rögzíteni:
0qq
- Másolja a számot:
- Mozgasson lefelé egy sort, és illessze be a számot:
+P
- lépjen vissza a sor elejére és növelje a számot:
0<c-a>
- Lépjen vissza a sor elejére (tehát a makró nem törik el, ha kétszeres számra kerül!):
0
- 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
. - Mentse a makrót:
q
- 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. Ah
szöveget lecserélném a0
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.
awk
valószínűleg ennek a feladatnak az eszköze. De ‘ m Windows-on (sóhajtok).cat
vagynl
, amelyek képesek megadni a sorokat, de nem = “3ab99f7668”>