Regex pro sed

Regex pro sed
« 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.








k3dAR

  • *****
  • 2 856
  • porad nemam telo, ale uz mam hlavu... nobody
    • Zobrazit profil
    • E-mail
Re:Regex pro sed
« Odpověď #2 kdy: 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 \+

tecka

  • ***
  • 138
    • Zobrazit profil
    • E-mail
Re:Regex pro sed
« Odpověď #3 kdy: 05. 04. 2022, 04:25:59 »
Kód: [Vybrat]
sed ':loop s/\(<[^>]*\)\.\([^>]*>\)/\1_\2/g; t loop; s/[<>]//g'

Re:Regex pro sed
« Odpověď #4 kdy: 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.