Portál AbcLinuxu, 9. května 2025 06:28

Dotaz: regex - deset skupin pro nahrazení

Marián Kyral avatar 20.12.2011 09:32 Marián Kyral | skóre: 29 | blog: Sem_Tam | Frýdek-Místek
regex - deset skupin pro nahrazení
Přečteno: 236×
Odpovědět | Admin
Zdravím, narazil jsem na zajímavý problém a momentálně si s ním nevím rady.

V kate mám následující regexp:
([0-9]+) +([^0-9]+) +([0-9]+) +([^0-9]+) +([0-9 ]+) +([^0-9]+) +([0-9]+) +([^0-9]+) +([0-9]+) +([^0-9]+)
Je tam deset skupin, ovšem při nahrazování můžu použít maximálně devět \1 - \9 Marně přemýšlím nad tím, jak tam dostat i tu poslední skupinu. V jednom běhu to nepůjde, takže jediná možnost je to nějak rozdělit na dva kroky.
Nástroje: Začni sledovat (3) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

20.12.2011 10:06 NeoV | skóre: 23
Rozbalit Rozbalit vše Re: regex - deset skupin pro nahrazení
Odpovědět | | Sbalit | Link | Blokovat | Admin
Velmi by pomohlo keby si napisal o aky jazyk sa jedna.

Prip. nejaky kus kodu v ktorom si to pouzil... resp. preco si nepouzil iba jedno '([0-9]+)' v spojeni s prepinacom 'g'
Marián Kyral avatar 20.12.2011 11:30 Marián Kyral | skóre: 29 | blog: Sem_Tam | Frýdek-Místek
Rozbalit Rozbalit vše Re: regex - deset skupin pro nahrazení
Chtěl jsem si vygenerovat insert:
1 ABC 2 BCD 3 CDE 4 DEF 5 EFG
1 ABC 2 BCD 3 CDE 6 OPN 10 RST
...

insert into XX (\1, '\2', \3, '\4', \5,, '\6', \7, '\8', \9, '\10!!!');
Zatím jsem tam tu poslední skupinu dokopíroval ručně, ale v budoucnu by se to mohlo hodit. Kdysi dávno jsem podobné věci řešil pomocí csv souboru a shell skriptu. Jen jsem ho musel pokaždé upravovat. Možná je čas na nějaký obecnější skript - parametry budou csv soubor a šablona s pozičními parametry.
20.12.2011 11:46 CET
Rozbalit Rozbalit vše Re: regex - deset skupin pro nahrazení
Odpovědět | | Sbalit | Link | Blokovat | Admin
No ja nevim, tohle je mozna lepsi zpracovat nejakym skriptem. To nahrazovani pomoci regexp v Kate je spis mysleno asi pro editaci a ne zpracovani dat.

Zalezelo by na tom, jaky je skutecny format radky a co s tim chces nakonec udelat. Pokud jsou to opravdu jenom cisla a necisla oddelena mezerou, tak staci perl perl -aF'/\s+/' -ne 'print sprintf("insert into XXX ("."%s,\"%s\"," x 5 . ");",@F);' pokud by to byl slozitejsi format, tak jiny perl perl -ne '@F=/([0-9]+) +([^0-9]+) +([0-9]+) +([^0-9]+) +([0-9 ]+) +([^0-9]+) +([0-9]+) +([^0-9]+) +([0-9]+) +([^0-9]+)/;print sprintf("insert into XXX ("."%s,\"%s\"," x 5 . ");",@F);'

Jinak, rekl bych, ze v 5.zavorce mas navic v seznamu znaku mezeru ... aspon takhle by se ti mezera zapocitala do 5.zavorky a jedna mezera ne (jako oddelovac), pokud bys mel vic mezer. Ono to mozna funguje, pokud mas jednu mezeru, ale pri vice to nebude fungovat spravne (pokud to ma skutecne brat jenom cisla).

Jinak ten tvuj problem bych bud zkusil resit primo importem do DB (mysql ma nejaky load data....) a nebo tim skriptem (treba i jenom tim perl filtrem).
Marián Kyral avatar 20.12.2011 13:23 Marián Kyral | skóre: 29 | blog: Sem_Tam | Frýdek-Místek
Rozbalit Rozbalit vše Re: regex - deset skupin pro nahrazení
Díky, ten perl vypadá zajímavě.

O možnostech přímého importu vím, v Oracle je sqlloader ale v mém případě je to zbytečný overkil. Navíc ty inserty stejně potřebuji vygenerovat, ne všechna porstředí, kam to půjde, mají sqlloader správně nakonfigurovaný. Inserty jsou jistota. Předtím jsem to vždy dělal pomocí shell scriptu, pak jsem si zvykl na regexp v kate a tohle je poprvé, kdy jsem s nimi narazil. S něčím takovým se u regexp nepočítá :-)

Jinak s tou mezerou máš pravdu, v další verzi jsem ji už odstranil.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.