Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: Aleš Rygl 04. 04. 2022, 17:10:02

Název: Regex pro sed
Přispěvatel: Aleš Rygl 04. 04. 2022, 17:10:02
Ahoj,
už chvíli se trápím s násl. problémem. Mám soubor, kde se mohou vyskytovat řádky zhruba v této podobě:

1648833000,nejakystring.nejakystring.dalsistring.<raz>,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
1648833000,nejakystring.nejakystring.dalsistring.<raz.dva>,0,0,0,0,0,>,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
1648833000,nejakystring.nejakystring.dalsistring.<raz.dva.tri>,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
1648833000,nejakystring.nejakystring.dalsistring.<raz.dva.tri.ctyri>,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
1648833000,nejakystring.nejakystring.dalsistring.ajestejeden.<IP.AD.RE.SA>.<IP.AD.RE.SA>,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0


Čili timestamp, pak nějake řetězce s náhodným počtem oddělené tečkou, následuje "<", opět sada řetězců doddělěných tečkou a znak ">". Případně tam může být jedna nebo dvě IP adresy, opět uvozene a ukončené "<", ">".

Mým cílem je odstranit "<", ">" a všechny tečky, které se nacházejí mezi znaky "<", ">", nagradit podtržítkem.

1648833000,nejakystring.nejakystring.dalsistring.raz,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
1648833000,nejakystring.nejakystring.dalsistring.raz_dva,0,0,0,0,0,>,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
1648833000,nejakystring.nejakystring.dalsistring.raz_dva_tri,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
1648833000,nejakystring.nejakystring.dalsistring.raz_dva_tri_ctyri,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
1648833000,nejakystring.nejakystring.dalsistring.ajestejeden.IP_AD_RE_SA.IP_AD_RE_SA,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0


Problém je v tom, že počet teček k nahrazení se může měnit, jinak by to bylo snadné a nevím jestli se v sed-u něco jako dynamický počet capture groups, resp. back-references, dá použít, alespoň jsem na nic takového nenarazil. Protože počet teček mezi "<", ">" je omezený (jde v podstatě o FQDN), vyřešil jsem to několika regexy pro jejich různé počty. Ale nejsem s tím příliš spokojen. Např. pro <raz.dva> :

sed 's/<\([^.]*\)\.\([^.]*\)\.\([^.]*\)>/\1_\2_\3/g'

Nedalo by se to vyřešit za pomocí hold bufferu? Zachytit v prvnim kroku vše mezi "<", ">" a v tom tečky nahradit?

Diky za tipy

A.





Název: Re:Regex pro sed
Přispěvatel: Wangarad 04. 04. 2022, 18:53:19
https://betterprogramming.pub/5-different-ways-to-remove-specific-characters-from-a-string-in-python-b0e081839ab9
Název: Re:Regex pro sed
Přispěvatel: k3dAR 04. 04. 2022, 20:18:33
nejsem si jistej co presne chces, ale mozna pomuze informace ze lze rict sedu "jakekoliv mnozstvi techto znaku":
Kód: [Vybrat]
sed 's/<[a-zA-Z.]\+>//'to odstrani mezi znaky < a > jakekoliv mnozstvi znaku a az z, A az Z a tecka, to jakekoliv mnozsti zajistujou znaky \+
Název: Re:Regex pro sed
Přispěvatel: tecka 05. 04. 2022, 04:25:59
Kód: [Vybrat]
sed ':loop s/\(<[^>]*\)\.\([^>]*>\)/\1_\2/g; t loop; s/[<>]//g'
Název: Re:Regex pro sed
Přispěvatel: Aleš Rygl 05. 04. 2022, 08:44:37
Kód: [Vybrat]
sed ':loop s/\(<[^>]*\)\.\([^>]*>\)/\1_\2/g; t loop; s/[<>]//g'

Super, diky, to je presne to postrceni, ktere jsem potreboval. Vedel jsem, ze to pujde. Cykly si nastuduji.

Jeste jednou dekuji!

A.