sed insert vessző

Fórumok

Hahó!

A következően kezdődő sorokat kéne módosítani:

line_1:1234 budapest titkos utca 2.

mégpedig így:

line_1:1234, budapest, titkos utca 2.

Tehát két vesszőt kéne beilleszteni az adott sorba.
Az irányítószám és a város után. (csv lesz az adott sorból)
Ahol a budapest van ott természetesen más településnév is előfordul, tehát nem lehet fix
pozicíóba (oszlopba) rakni a második vesszőt. Ez a négyjegyű irányítószámnál asszem járható.

köszönöm a segítséget.

Hozzászólások

Pl.:

echo "line_1:1234 budapest titkos utca 2." | sed -e 's/\s\+/,/' | sed -e 's/\s\+/,/'

vagy

echo "line_1:1234 budapest titkos utca 2." | sed -r 's/\s+(\S+)\s+/,\1,/'

sed -r 's/^[^:]*:([^ ]*) *([^ ]*) *(.*)/\1,\2,\3/' <<<'line_1:1234 budapest titkos utca 2.'
1234,budapest,titkos utca 2.

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Ezzel csak az a baj, hogy rossz az input, mert nincs formázva. Ha feltételezzük, hogy lehet szóköz a helységnévben, akkor az egyedüli megoldás szerintem, hogy egy szótár ismeri a világ összes helységnevét, s az alapján szúrja ki, hogy meddig tart. A másik lehetőség, hogy vélelmezzük, nincs benne szóköz. A harmadik, hogy az input file normálisan struktúrált. Jelenleg a másodikkal élhetünk szerintem.

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

a több szóból álló településneveknél ha a szóközt át tudod cserélni valami nonszensz karakterre (pl. #), akkor very easy awk-val.

En erre inkabb awk-ot hasznalnek, hiszen nem klasszikus karaktercsererol van szo (amire inkabb jo a sed), hanem adott poziciora beszurasrol ahogy te is irod. Mas kerdes, hogy az adott pozicio, az nem adott karaktert jelent, hanem adott "oszlop"-ot inkabb.

echo line_1:1234 budapest titkos utca 2. | awk '{print $1", "$2", "$3,$4,$5}'

Én is az awk-t javaslom, bár az FS is bekerülhet egy BEGIN után.
Mondj kérlek egyetlen településnevet, ami nem egy szó.. Nem ismerek olyat
--------
Elmélkedtem. Ha több szavas a településnév meg az utcanév, előbb kézzel át kell szerkeszteni a teljes fájlt, kicserélve benne az összes mezőelválasztót tabulátorra vagy bármire, ami nem betű.
Oszt' Riga.

---
--- A gond akkor van, ha látszólag minden működik. ---
---

A település és településrész neve együttes használata sokszor hasznos, sőt szükséges a pontossághoz, így egyszerű megoldás nem nagyon lesz arra nézve, hogy az irányítószám utáni rész hogyan tagolandó település és közterület részekre. Lehet sakkozni, hogy ha a irsz. utáni második szó zárójelben/idézőjelben van, akkor az a település(rész) neve, és utána kell bebiggyeszteni a mezőhatárolót - de pl. a "Nyíregyháza Oros", vagy "Nyíregyháza - Oros" esetén hibázni fog. Mondjuk ez utóbbi kezelhető az egész móka előtt azzal, hogy a kötőjelek előtti/utáni szóközöket kiirtod a fájlból.

Öööö, lehet, hogy félreértesz. Szikáncs egy önálló település, ami közigazgatásilag Hódmezővásárhelyhez tartozik (kb. 10km-re van a várostól). Tehát nem városrész, mint amiket példaként adtál (nyugodtan nézd meg google maps-on vagy bárhol).
Külön irányítószáma is van (Vásárhely 6800, Szikáncs pedig 6806, ha jól tévedek).

Néhány évvel (kb. 3-5?) ezelőttig a neve "egyszerűen" Szikáncs volt (már évmilliók óta), csak valamelyik okos kitalálta, hogy mostantól legyen inkább "Hódmezővásárhely Szikáncs" (vagy nem is tudom, pontosan hogyan kell írni). A "szikáncsiak" személyi igazolványán (vagyis pontosabban a lakcímkártyán) nem Szikáncs vagy Hódmezővásárhely szerepel, hanem Hódmezővásárhely Szikáncs (valamilyen verzióban, vagy kötőjellel, vagy szóközzel, hirtelen nem ugrik be).
Tudom, mert amikor érettségi jegyző voltam, a szoftverben nemigen lehetett így felvinni a településnevet.

De tessék-lássék, egy 2009-es felhívás:

Felhívjuk az érintettek figyelmét arra, hogy a külterületeken – Batida, Szikáncs, Erzsébet, Kútvölgy – élők olyan lakcímkártya birtokában szavazhatnak, amelyen Hódmezővásárhely és az utca neve mellett az adott településnév is szerepel. Mindez az azonos utcanevek megkülönböztetése érdekében szükséges. Azok, akik nem cserélték ki lakcímkártyájukat, mihamarabb tegyék meg, az újat ingyen kapják.

bash-4.2$ cat testfile
line1:42745 peldavaros random utca 46541
line1:2465 budapest lofasz utca 555
2465 grh cdasfrgh ter 3
line1:7835 aaaa bbbb 1354
line1: itt szokoz volt!
line1:4254 dudapest vodka utca 24 es ezeket mar le fogja vagni
bash-4.2$ awk '{if (/^line1:/) print $1", "$2", "$3" "$4" "$5; else print $0}' testfile
line1:42745, peldavaros, random utca 46541
line1:2465, budapest, lofasz utca 555
2465 grh cdasfrgh ter 3
line1:7835, aaaa, bbbb 1354
line1: itt szokoz volt!
line1:4254, dudapest, vodka utca 24
bash-4.2$

az utolsó sorban lévő gyengeség kivédését rád bízom :)

szerk. ez a szar nem jelzi, de a szóközös sor tényleg egy szóközzel kezdődik

A helyrajzi szám szívás, mert a példából nem derül ki az esetleges formátuma, de a többi megoldható.

{soreleje}{line_1:}{szám}{településnév pontosan egy szó}{egységnév minimum egy szó}{szám}{sorvége}
Innentől kezdve egyértelműen definiált minden blokk -> szűrhető.
Az más kérdés, hogy ha valahol megsérti a szabályt az input, akkor csúnyán elcsúszhat.

Nemide srry

---------------------------------------------------
Hell is empty and all the devils are here.
-- Wm. Shakespeare, "The Tempest"