Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: 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.
-
https://betterprogramming.pub/5-different-ways-to-remove-specific-characters-from-a-string-in-python-b0e081839ab9
-
nejsem si jistej co presne chces, ale mozna pomuze informace ze lze rict sedu "jakekoliv mnozstvi techto znaku":
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 \+
-
sed ':loop s/\(<[^>]*\)\.\([^>]*>\)/\1_\2/g; t loop; s/[<>]//g'
-
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.