Jak přidat stálá čísla řádků do souboru?

Mám takový textový soubor (pomocí systému gVim ve Windows)

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

Chci přidat číslo do každého řádku v souboru. Nepoužívá :set number, ale přidává číslo jako text před každým řádkem, takže číslo je součástí souboru.

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

Komentáře

  • awk je pravděpodobně nástrojem pro tuto práci. Ale ‚ m ve Windows (povzdech).
  • Zodpovězeno zde již , nevadí 🙂
  • Možná .. Nebo je to obecnější?
  • Je to podobné ‚, ale nechtěl bych ‚ Nevím, co jsou čísla stálých linek. Zadruhé, druhá otázka se týká všech řádků (a to dělá odpověď) konkrétně pro gVim v systému Windows a toto je jednoduchý očíslovaný seznam pro jeden odstavec pouze v prostém vimu.
  • Myslím, že příspěvek používá id = „89061d7645“>

trvalé “ ot označují, že vyrovnávací paměť má být upravena a že čísla nejsou ‚ Nějaká čistě vizuální věc (stejná jako vy). Důvodem pro specifikaci gvim v systému Windows je vyhnout se externím nástrojům, jako jsoucatnebonl, které umí dělat číselné řádky, ale nejsou ‚ t obecně dostupné ve Windows (jak OP naznačuje z jejich komentáře oawk). Horní dvě řešení jsou čistě Vim. A konečně, všechny řádky vs jedna para je jen otázkou výběru rozsahu. Zjevně to není velký problém.

Odpověď

Čistým způsobem Vim:

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

Vysvětlení:

:%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 

Viz :help \= a :help line().

Použití výrazu v náhradní části je velmi silné a FWIW je docela dobrým výchozím bodem pro vimscript.

Komentáře

  • Jak mohu přidat tento velmi užitečný příkaz na mapu klíčů ve vimrc?
  • Chcete-li se dostat k tématu nápovědy vim pro nahrazení: :help sub-replace-expression

Odpověď

Jedna hezká věc na makrech Vim je, že se mohou opakovat (mohou se sami vyvolat) ):

  1. Vymazat registr q: qqq
  2. Přidejte číslo do prvního řádku: ggI1. (nezapomeňte na mezeru!)
  3. Vraťte se na začátek řádku a začněte zaznamenávat makro: 0qq
  4. Zkopírujte číslo:
  5. Posunout řádek dolů a vložit číslo: +P
  6. Přesunout zpět na začátek řádku a zvýšit číslo: 0<c-a>
  7. Přesunout zpět na začátek řádku (takže se makro nezruší, když se dostane na dvojnásobné hodnoty!): 0
  8. Makro zavolejte jednou, aby bylo rekurzivní. V tomto okamžiku v registru q stále nic není, takže se nic nestane: @q.
  9. Uložte makro: q
  10. Zavolejte makro ještě jednou a sledujte létání jisker !: @@

Makro bude pak pokračujte v samotném vyvolávání, dokud nedojde na konec souboru.

Rekurzivní trik s makrem můžete použít pro mnoho dalších podobných problémů, takže je dobré si toho být vědom.

Pokud z nějakého důvodu nechcete použít rekurzivní makro, můžete kroky 1 a 8 vynechat a použít počet ke spuštění makra vícekrát, např. 100@q spustí makro q stokrát.

Komentáře

  • Mocné věci, klaním se tvému mistrovství. Makra jsou pro mě jako černá magie …
  • @ropata, makro je pouze posloupností (většinou) příkazů v normálním režimu.
  • @romainl Myslím, že ‚ je lepší si to představit jako posloupnost stisknutí kláves .
  • @Rich, může to být posloupnost mnoha věcí, včetně ex příkazů.
  • @romainl Ano, ‚ proto si myslím, že ‚ je nejlepší to považovat za úhozy. Přehraje přesně to, co napíšete na klávesnici (včetně, jak říkáte, ex příkazů), jako byste to všechno zadali ručně.

Odpovědět

Rád používám globální příkaz vim k provádění takových úkolů. To platí pro přidání iterace na začátek řádku nebo úpravu symbolu v textu. Vypadá to komplikovaněji než ostatní řešení, ale je to docela flexibilní vzor, který můžete použít, když ho máte po ruce, a snadno jej upravíte, aniž byste ho hodně přemýšleli.

Nejprve vyberte svůj rozsah (které řádky vás chcete použít). Obvykle používám značky (např.ma na prvním řádku a mb na druhém, ale můžete také použít čísla řádků nebo vizuální výběr), poté zadejte úpravu následující příkaz (aktuálně vylepšený pro váš případ použití)

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

Dekonstrukce

:let i=1 

Tím se nastaví proměnná i s počáteční hodnotou. Seznamy obvykle začínají 1, takže nastavuji i na 1.

| 

Lišta spustí nový příkaz

"a,"b 

Tím se nastavuje rozsah dalšího příkazu. Jdu od značky a k označení b , který by byl nastaven na první řádek a poslední řádek vašeho seznamu.

g/^/ 

Toto je globální příkaz. Vyhledá v daném regulárním výrazu soubor (nebo rozsah) a zbytek příkazového řádku provede na každém řádcích, které se shodovaly. Přiřazuji každý řádek vyhledáním výrazu „začátek řádku“. Pokud jste měli text jako

Item some txt other text Item second item whatever Item third 

a chcete tyto štítky umístit pouze před Item a ostatní řádky ignorujte, místo toho g/Item/ nebo g/^Item/ (za předpokladu doslovného textu položky) )

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

Tím se provede regulární výraz, který nahradí začátek řádku hodnotou i spojenou s a .. Obecně to můžete udělat cokoli (například štítek Item nahraďte číslem).

|let i=i+1 

I když lišta spouští nový příkaz, nastaví druhý příkaz, který bude spuštěn v globálním příkazu, místo po dokončení globálního. Výsledkem je přírůstek i před zpracováním dalšího řádku g. Zde je další místo flexibility. Modifikace i může být cokoli (incre ment by 2, call a function that generates the next element of the Fibonacci sequence, whatever).

Answer

Add numbers to všechny řádky

Je možné použít :%!nl -ba nebo :%!cat -n příkazy, které přidají čísla řádků ke všem řádkům.

V systému Windows „Mám nainstalované Cygwin / MSYS / SUA.

Přidávání čísel k vybraným řádkům

Chcete-li přidat čísla pouze pro vybrané řádky, vyberte je v vizuální režim ( v a kurzory), poté po dokončení proveďte příkaz: :%!nl (ignorujte prázdné řádky) nebo :%!cat -n (včetně prázdných řádků).

Formátování

Chcete-li odstranit mezery navíc, vyberte je ve vizuálním bloku ( Ctrl + v ) a odstraňte je ( x ).

Chcete-li přidat některé znaky (., :, ) za čísly, vyberte je ve vizuálním bloku ( Ctrl + v ), poté přidejte znak ( A , zadejte znak a poté ukončete Esc ).

Komentáře

  • Toto neposkytuje stejné formátování, jaké je uvedeno v otázce. Líbí se mi však jednoduchost řešení.
  • @KarlYngveLerv å g Díky, zahrnoval jsem to do odpovědi.

Odpověď

Modifikace odpovědi romainl :

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

To nejen přidá čísla řádků, ale také nahradí opustí čísla řádků, pokud tam již jsou. Pokud jste vložili čáru do středu, přečísluje se vše podle očekávání.

Funguje to tak, že nahradíte libovolné číslo následované a. A mezerou na začátku řádku novým číslem . To se evidentně zlomí, pokud máte řádek, který již začíná tímto vzorem, proto použijte s myšlenkou.

Přidaná část:

  • ^ – Začátek řádku
  • \( – Spustit novou podskupinu
  • \d\+ – Sjednocení číslice jednou nebo více
  • \. – Shoda s tečkou (.) a mezerou .
  • \) – koncová podskupina
  • \? – Nastavit skupinu jako volitelnou, aby fungovala jako dříve, pokud na tomto řádku ještě není žádné číslo.

Bonusová nápověda :
Chcete-li odebrat čísla řádků, můžete použít stejný vzor s prázdnou částí repalce:

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

Odpovědět

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

Tím se číslují první dva řádky a můžete stisknout @q očíslovat následující řádky (nebo zadat např. 18@q pokud chcete počítat celkem 20 řádků).

Vysvětlení:

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 

Výhodou je, že nevyžaduje žádné externí příkazy, což je užitečné, pokud jste například pracujete s Vim na Windows.

Komentáře

  • Po zadání 1. <esc>h jste na druhý sloupec, ne první sloupec. Nahradil bych h řetězcem 0, po kterém si myslím, že vaše řešení by mělo být velmi dobré.
  • @KarlYngveLerv å g Jejda, to byl překlep. Díky, opraveno.
  • Žádný problém. Stále jste však neaktualizovali vysvětlení. Také: Na mnoha klávesnicích ^ čeká na druhý znak, aby umožnil psaní kombinací jako ^a -> â. Stále souhlasím s tím nejlepším řešením, ale myslím, že by to mělo být také zmíněno.

Odpověď

I myslím, že zvolená odpověď je nejlepší, ale v rozmanitosti nabídnu alternativu pomocí externího programu:

:%!cat -n 

Tím se vyfiltruje celý váš vyrovnávací paměť (označená %) prostřednictvím externího programu cat, kde je -n příznak předchází každému řádku vstupu číslo řádku.

To samozřejmě vyžaduje, abyste měli nainstalovanou cat, což platí pro (pravděpodobně) všechny Unix podobné systémy.

Další podrobnosti o filtrování prostřednictvím externích programů najdete v :help :range!.

Komentáře

  • Uvědomuji si, že žadatel používá gVim ve Windows, takže toto řešení tam pravděpodobně nebude fungovat ‚. Myslím si však, že stále poskytuje určitou příležitost pro ostatní t o poučit se z toho.
  • Pokud jste ‚ nainstalovali msysgit a přidali jej do své PATH (IIRC it ‚ s možností instalace), toto řešení by mělo fungovat i ve Windows.
  • není POSIX, ale nl ano, takže to může být lepší volba.

Odpověď

Trochu hackerské řešení může být následující (vše napsané mezi < a> mají být vloženy po stisknutí Ctrl + v ):

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

Dekonstrukce

:%normal {commands} 

spustí příkaz normálního režimu na každém řádku určeném rozsahem, v tomto případě na každém řádku

:redir @" 

přesměruje každý výstup provedený ex příkazy do nepojmenované vyrovnávací paměti.

:.= 

je ex příkaz, který vygeneruje aktuální řádek číslo (s předchozím novým řádkem bohužel)

:redir END 

zastaví přesměrování na nepojmenovanou vyrovnávací paměť

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

vloží obsah nepojmenované vyrovnávací paměti pomocí a. a záložku před každý řádek a opustí režim vložení.

kdd 

přejde o jeden řádek nahoru a odstraní nový řádek, který je výsledkem:. = příkaz.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *