13
« kdy: 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.