04.11.2013, Vladimír Klaus, navštíveno 10887x
Možná jste někdy potřebovali zjistit počet řádek v textovém souboru nebo počet výskytů nějakého textu v textovém souboru nebo dokonce více souborech.
Pokud spustíte příkazový řádek, resp. vytvoříte dávkový soubor, máte k dispozici řadu zajímavých příkazů, mezi nimiž jsou i FIND a FINDSTR. Především druhý z nich toho umí opravdu hodně, v tomto článku si ale představíme především jeho jednodušší použití.
Kde se vyskytuje hledaný text
Například mě zajímá, na kterých řádcích se vyskytuje text "string". Bude nám k tomu stačit pouhý příkaz FIND, který umí najít v souboru textový řetězec a každou takovou řádku vypíše.
@echo off
FIND "string" DebugUtils.pas
pause
Účel to sice splnilo, ale není to moc přehledné. Co se s tím dá dělat, si ukážeme jedním drobným vylepšením. Pomocí parametru /n se před každou řádkou zobrazí její číslo v rámci textového souboru.
FIND /n "string" DebugUtils.pas
Počet řádek, ve kterých se vyskytuje hledaný text
I toto je velmi jednoduché, vyjdeme z předchozího příkladu. Doplněním parametru /c se zajistí, že bude pouze vypsán počet, nikoliv jednotlivé řádky.
FIND /c "string" DebugUtils.pas
Tady je třeba upozornit, že nejde o celkový počet výskytů daného slova v souboru, ale jen o počet řádek (na řádce může být slovo vícekrát). Zjištění skutečného počtu výskytů je mnohem složitější.
Hledání textu bez ohledu na velikost písmen
Vše výše uvedené se dá vylepšit ještě parametrem /i. Díky němu se při hledání nebude rozlišovat velikost písmen.
FIND /i "string" DebugUtils.pas
FIND /n /i "string" DebugUtils.pas
FIND /c /i "string" DebugUtils.pas
Porovnáním s předchozím obrázkem je zřejmé, že máme v textovém souboru 3x napsán text „string“ jinak než všemi malými písmeny.
Kde se vyskytuje hledaný text, varianta 2
Příkaz FINDSTR je modernější a tedy i dokonalejší. Parametry používané u FIND byly převzaty, až na /c. Příkaz přináší také podporu regulárních výrazů. To je velice mocný prostředek, my ho ale zde využijeme velmi jednoduše. Ale o tom až dále.
FINDSTR /n "string" DebugUtils.pas
Počet řádek textového souboru
Nyní se konečně dostáváme k tomu, o čem má být celý článek. Jak spočítáme počet řádek textového souboru, případně více souborů. Problémem je, že vlastně nehledáme žádný text. Využijeme tedy regulárního výrazu „^“, který značí začátek řádky. Aby se hledaný text chápal jako regulární výraz, musíme přidat parametr /r.
Tímto příkazem tedy vypíšeme všechny řádky, které mají nějaký začátek. No zkrátka všechny řádky… J
FINDSTR /r /n "^" DebugUtils.pas
A teď musíme tento výsledek spočítat a nějak se dopracovat k těm 142. S tím nám zase pomůže obyčejný FIND. Výsledek předáme příkazu FIND pomocí svislítka. Vlastně tím říkáme, že FIND nemá hledat v nějakém souboru, ale v tom, co mu předáme. A protože náš výsledek obsahuje čísla řádků následovaná dvojtečkou, stačí hledat (spočítat) řádky obsahující dvojtečku.
FINDSTR /r /n "^" DebugUtils.pas | FIND /c ":"
Hledat, resp. počítat řádky je možné i ve více souborech.
FINDSTR /r /n "^" *.pas | FIND /c ":"
Nyní se dostáváme k tomu, proč jsem vlastně toto vše potřeboval. Připravoval jsem migraci staršího projektu a bylo třeba projít všechen kód, kde se pracovalo s datumy. Jak tedy najít místa, kterými se budu muset zabývat? Třeba takto:
FINDSTR /r /n "TDate DateToStr StrToDate DateTimeStrEval" *.pas
Pokud totiž hledáte více textů, stačí je oddělit mezerou a příkaz FINDSTR to pochopí. Pokud byste ale naopak chtěli hledat nějaké sousloví, pak se musí přidat parametr /c:.
FINDSTR /r /n /c:"while Y > 0 do" *.pas
Popis příkazů a parametrů
Další informace o možnostech a parametrech příkazů zjistíte pomocí parametru "/?", kdy bude přímo vypsána stručná nápověda.
FIND /?
FINDSTR /?
Pokud vás zajímají další informace a příklady, najdete je v detailním popisu příkazu FIND a FINDSTR na stránkách Microsoftu.
Zajímavost na závěr
Je možné spočítat počet řádek jen za pomocí obyčejného FIND? Ano, možné to je, ale proč tomu tak je, to už si musíte zjistit sami. Není to těžké.
FIND /c /v "" DebugUtils.pas