lägga till en substräng på slutet av en sträng [LÖST]

Här diskuterar vi skal, kommandon och klassiska linuxverktyg.
Användarvisningsbild
micke_nordin
Inlägg: 1539
Blev medlem: 21 aug 2008, 17:03
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Kontakt:

lägga till en substräng på slutet av en sträng [LÖST]

Inlägg av micke_nordin »

Jag har en tabavgrändad textfil. I den finns tre kolumner: rapportnummer, författarnamn och titel. T.ex:

Kod: Markera allt

2006:09 	Nordin, Mikael 	Boplats, gravar och en fångstgrop vid Sörby. Tuna 142:1, 143, 144 & 145, Sörby 5:1, Tuna socken, Nyköpings kommun, Södermanlands län. Arkeologisk förundersökning och särskild undersökning.Nyköping. 
I den här filen skulle jag vilja använda ett regex för att matcha kommun och socken namn och lägga till dessa som nya kolumner i slutet på raden. Alltså:
Rapportnummer Författare Titel → Rapportnummer Författare Titel Kommun Socken

Ovanstående exempel skall alltså bli:

Kod: Markera allt

2006:09 	Nordin, Mikael 	Boplats, gravar och en fångstgrop vid Sörby. Tuna 142:1, 143, 144 & 145, Sörby 5:1, Tuna socken, Nyköpings kommun, Södermanlands län. Arkeologisk förundersökning och särskild undersökning.Nyköping. Nyköping Tuna


Kommun är en substräng som matchar regexet "\b.*\b kommun" och socken en substräng som matchar "\b.*\b socken" och som finns i titeln

Jag har nu hållt på och försökt förstå hur jag skall kunna matcha ett regex och lägga den sist på raden med sed, men jag får inte till det. Kan någon hjälpa att fixa det med sed, eller kanske awk eller nått annat bra verktyg?

/Micke
Senast redigerad av 1 micke_nordin, redigerad totalt 19 gånger.
Användarvisningsbild
Konservburk
Inlägg: 5919
Blev medlem: 07 apr 2007, 22:28

Re: lägga till en substräng på slutet av en sträng

Inlägg av Konservburk »

&, \1 ... \9 refererar till det som matchade, exempelvis:

Kod: Markera allt

sed 's/\s\+\(\S\+\)\s\+kommun,.*/&\t\1/;s/\s\+\(\S\+\)\s\+socken,.*/&\t\1/'
Användarvisningsbild
micke_nordin
Inlägg: 1539
Blev medlem: 21 aug 2008, 17:03
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Kontakt:

Re: lägga till en substräng på slutet av en sträng

Inlägg av micke_nordin »

Tack för hjälpen, det löser de flesta raderna, resten kan jag nog fixa för hand.
Konservburk skrev:&, \1 ... \9 refererar till det som matchade, exempelvis:
Så långt är jag med, men vad är det du gör för att få sed att låta den matchade texten ligga kvar samtidigt som du bara lägger kommunnamnet sist? Jag hänger inte riktigt med på regexet...

Kod: Markera allt

sed 's/\s\+\(\S\+\)\s\+kommun,.*/&\t\1/;s/\s\+\(\S\+\)\s\+socken,.*/&\t\1/'
Det som ser mest konstigt ut är det escapeade plustecknet. Är det ett eller fler av det föregående? Varför escapeat? Vad är det för skillnad på & och \1 i det här sammanhanget, varför får du inte med hela matchningen utan bara kommunnamnet?

/Micke
Användarvisningsbild
Konservburk
Inlägg: 5919
Blev medlem: 07 apr 2007, 22:28

Re: lägga till en substräng på slutet av en sträng

Inlägg av Konservburk »

Det finns ett gäng olika dialketer av regexp. Just när det gäller sed så betyder \+ ett eller flera. Om vi bryter ner det hela så kanske det blir lättare att inse vad som händer...


Substitutionskommandot:

s/Matchning/Ersättning/


Matchning:

\s - ett mellanrum
\s\+ - ett eller flera mellanrum
\S - ett tecken som inte är något mellanrum
\S\+ - ett eller flera tecken som inte är något mellanrum

\(\S\+\) - gruppering


Ersättning:

& - hela matchingen
\1 - första grupperingen


2006:09 Nordin, Mikael Boplats, gravar och en fångstgrop vid Sörby. Tuna 142:1, 143, 144 & 145, Sörby 5:1, Tuna socken, Nyköpings kommun, Södermanlands län. Arkeologisk förundersökning och särskild undersökning.Nyköping. Nyköping Tuna

s/\s\+\(\S\+\)\s\+kommun,.*/&\t\1/

&-tecknet blir hela matchningen, dvs blå, grön och röd. Grå matchas inte alls.
Användarvisningsbild
micke_nordin
Inlägg: 1539
Blev medlem: 21 aug 2008, 17:03
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Kontakt:

Re: lägga till en substräng på slutet av en sträng

Inlägg av micke_nordin »

Snyggt! Verkligen bra förklarat, tack igen!

/Micke
Skriv svar

Återgå till "Terminalforum"