Ubuntu Suomen keskustelualueet
Ubuntun käyttö => Ohjelmointi, palvelimet ja muu edistyneempi käyttö => Aiheen aloitti: Dost - 04.01.11 - klo:15.48
-
Tarkoitus on skriptillä muokata tiedostoa file.txt korvaamalla sana "dog" sisältöllä tiedostosta file2.txt.
file.txt:
The quick brown fox jumps over the lazy dog
file2.txt:
weasel
Tuloksen pitää olla tiedostossa file.txt:
The quick brown fox jumps over the lazy weasel
En osaa tehdä tuota ja olen aika aloittelija skriptauksessa. Löysin tavan korvata sanan, mutta se ei ole sitä mitä haen, koska se ei korva toisen tiedoston sisältöllä, vaan valmiiksi annetulla sanalla:
script1:
#!/bin/bash
sed -i 's/dog/weasel/g' file.txt
Jos bash ei taivu siihen, niin osaako python? Voi ehdottaa pythoniakin.
-
Onnistunee tuo sedillä ja jopa bashillakin, mutta äkkiseltään näin pythonilla:
#!/usr/bin/env python
from sys import argv
w = open(argv[2]).readline().rstrip()
for line in open(argv[1]):
line = line.replace('dog', w)
print(line)
Tuossa siis ”dog” on kovokoodattu ohjelmaan, mutta tiedostot annetaan komentoriviparametreina – ensin tekstin sisältävä, sitten dog-sanan korvaavan sanan sisältävä tiedosto.
Muoks: En malttanut olla kokeilematta... Ihan yksiriviseksi ohjelmaa ei pythonissa saa, jos komentorivi on tarpeen, mutta aika hyvin:
#!/usr/bin/env python
from sys import argv
print('\n'.join([line.replace('dog', open(argv[2]).readline().rstrip()) for line in open(argv[1])]))
Kaari- ja hakasuljeviidakosta ei kyllä enää ota tolkkua erkkikään :)
-
Noin jää jäljelle vain weasel
$ echo 'The quick brown fox jumps over the lazy dog' | sed 's/\(.*\)dog\(.*\)/weasel/g'
weasel
Laitetaanv ähän lisää vinkkiä pätkimisestä
$ echo 'Kirjoitan Ubuntun keskustelupalstalle' | sed 's/\(.*\)Ubuntun\(.*\)/Suoli24\2/g'
Suoli24 keskustelupalstalle
ja
echo 'Kirjoitan Ubuntun keskustelupalstalle' | sed 's/\(.*\)Ubuntun\(.*\)/\1Suoli24/g'
Kirjoitan Suoli24
ja
echo 'Kirjoitan Ubuntun keskustelupalstalle' | sed 's/\(.*\)Ubuntun\(.*\)/\1Suoli24\2/g'
Kirjoitan Suoli24 keskustelupalstalle
-
Ymmärtääkseni tässä on ongelmana saada sen dog-sanan paikalle tuohon sed:n lauseeseen se file2.txt:ssä oleva sana. Ehkäpä näin:
#!/bin/bash
cat file2.txt |xargs -I{} sed -i 's/dog/{}/g' file.txt
-
Kiitos neuvoista! Toimivat bash ja python versiot niin kuin pitää. Harjoittelen lisää.
-
Alkutilanne on siis tämä
$ cat file.txt
the quick brown fox jumps over a lazy dog
$ cat file1.txt
weasel
Jos unix komennolle (esim sed) halutaan antaa parametriksi jonkun toisen komennon tulos (cat file1.txt) niin tämä toinen komento upotetaan toisen sisään käyttäen kenossa olevaa yksinkertaista lainausmerkkiä (`) http://en.wikipedia.org/wiki/Grave_accent. Huomaa ero:
$ echo 'cat file1.txt'
cat file1.txt
$ echo `cat file1.txt`
weasel
Eli sovellettuna
$ sed -i -e s/dog/`cat file1.txt`/ file.txt
$ cat file.txt
the quick brown fox jumps over a lazy weasel
Löytyy bash manuaalista termillä 'command substitution'
-
Löytyi myös tuollainen suositus:
Why is $(...) preferred over `...` (backticks)? (http://mywiki.wooledge.org/BashFAQ/082)
Eli on kai selvempää kirjoittaa näin:
sed -i -e s/dog/$(cat file1.txt)/ file.txt
-
Why is $(...) preferred over `...` (backticks)?
Tuo "taala-sulku" -muoto näyttää kyllä havainnollisemmalta lukea noiden "kenoheittomerkkien" pienuuden takia ja myöskin sen takia että alku- ja loppumerkki ovat erilaisia sulkujen tapauksessa vaikka itse olen käyttänyt tuota vaikeammin luettavaa muotoa miettimättä sen enempää.
Bash: in avulla pystyy tekemään jo muutamilla riveillä usein ihmeitä. Itseäni ärsytti puolestaan joskus se suuren kaupungin rakennusvalvonnankin ylittävä pikkutarkkuus jolla bash kohtelee välilyöntiä tai yleensäkin "tyhjää tilaa" (taitaa olla huono käännös engl. "white space") jossain yhteydessä.
-
"kenoheittomerkkien"
Per. ”takahipsut”. Vrt. ”keno” (/), ”takakeno” (\) ja ”hipsu” = ’ (eli heittomerkki tai puolilainausmerkki).
"tyhjää tilaa" (taitaa olla huono käännös engl. "white space")
Tähän on ehdotettu ”tyhje”, ”tyhjemerkit”.
-
Ihan kuvaava nimi kyllä mutta:
Takahipsut ˵ jotain ˵
Takayksittäishipsut ʽ jotain ʽ
Takaheittomerkit ?
? :)
-
... Vrt. ”keno” (/), ”takakeno” (\) ja ...
Eikö se ole "kautta" (/) ja "keno" (\) (tai kauttaviiva ja kenoviiva)? Takakeno tuolle on kyllä ihan uusi nimitys ainakin minulle.
http://fi.wikipedia.org/wiki/V%C3%A4limerkki (http://fi.wikipedia.org/wiki/V%C3%A4limerkki) tuolla käytetään termejä vinoviiva ja kenoviiva.
.
-
Löytyi myös tuollainen suositus:
Why is $(...) preferred over `...` (backticks)? (http://mywiki.wooledge.org/BashFAQ/082)
Eli on kai selvempää kirjoittaa näin:
sed -i -e s/dog/$(cat file1.txt)/ file.txt
Jep. Näistä huonoista "old school" tavoista on vaikea oppia eroon. Molemmat toimii.
.
-
Eikö se ole "kautta" (/) ja "keno" (\) (tai kauttaviiva ja kenoviiva)?
Voi olla sukupolvien ero :) Keno- ja takakenoviivoista puhuttiin DOS-aikana. Kautta sen sijaan on aina ollut mahdollinen vaikka huono kenoviivan nimitys.
Taka- tulee tietysti kirjoitussuunnan perusteella. Kenoviiva kallistuu eteen- eli kirjoitussuunnan etenemissuuntaan päin, takakeno taaksepäin.
Ihan kuvaava nimi kyllä mutta:
Takahipsut ˵ jotain ˵
Takayksittäishipsut ʽ jotain ʽ
Oikeastaan ei, koska hipsu viittasi aina yksin-, ääh, ”yhden”-kertaiseen merkkiin. Suomeksihan ” on yksinkertaisesti lainausmerkki (tai kokolainausmerkki), ’ puolilainausmerkki.
-
Sisältääköhän SFS 4175 mitään tuohon liittyvää ?
-
... Taka- tulee tietysti kirjoitussuunnan perusteella. Kenoviiva kallistuu eteen- eli kirjoitussuunnan etenemissuuntaan päin, takakeno taaksepäin.
...
Olet erehtynyt.
http://fi.wikipedia.org/wiki/Vinoviiva (http://fi.wikipedia.org/wiki/Vinoviiva) (myös kauttaviiva)
http://fi.wikipedia.org/wiki/Kenoviiva (http://fi.wikipedia.org/wiki/Kenoviiva)
Takakenoviivaa ei ole olemassakaan.
-
Tuolta löytyikin hyvä viite asiaan:
http://www.ling.helsinki.fi/filt/info/mes2/merkkien-nimet.html (http://www.ling.helsinki.fi/filt/info/mes2/merkkien-nimet.html)
-
Olet erehtynyt.
En suinkaan. En nyt puhu siitä, miten nimiä on standardoitu, vaan miten niitä oikeasti käytettiin ainakin vielä 1980- ja 1990-luvuilla. Silloin / oli keno- ja \ takakenoviiva juuri mainitsemastani syystä.
-
Olet erehtynyt.
En suinkaan. En nyt puhu siitä, miten nimiä on standardoitu, vaan miten niitä oikeasti käytettiin ainakin vielä 1980- ja 1990-luvuilla. Silloin / oli keno- ja \ takakenoviiva juuri mainitsemastani syystä.
Ei käytetty. ei ainakaan yleisesti. Kautta ja keno olivat nykymerkityksessään käytössäni sekä 80 että 90 luvulla opiskelu ja työmaailmassa. Kenoviivasta alettiin tietenkin yleisemmin puhumaan vasta kun ensimmäiset kovelevylliset PC:t tulivat ja sitä käytettiin msdos:ssa hakemistoerottimina. Ennen sitä sitä ei oikeastaan tarvittu mihinkään.
-
Ei käytetty. ei ainakaan yleisesti.
Jokaisella on tietysti oma käsityksensä ”yleisyydestä”. Minun käsitykseni tulee Tampereen seudulta ja vuodesta 1988 alkaen yliopistosta, missä kuuntelin TKK:n väen ilmauksia.
Kenoviivasta alettiin tietenkin yleisemmin puhumaan vasta kun ensimmäiset kovelevylliset PC:t tulivat ja sitä käytettiin msdos:ssa hakemistoerottimina. Ennen sitä sitä ei oikeastaan tarvittu mihinkään.
Oikeastaan juuri sen takia takakeno olikin aika luonteva nimitys: kenohan oli jo ollut käytössä vuosikausia sitä ennen, kun taas takakeno – ikään kuin ”väärään suuntaan” kallistuva kenoviiva – yleistyi vasta MS-DOSsin myötä. Olihan se UNIXeissa ollut käytössä ennen sitäkin, mutta sitä ei tarvittu niin paljon.
-
Eli paikallinen slangi-ilmaisu. Kannattaisi varmaan jossain vaiheessa päivittää oma termistö noudattamaan yleisesti hyväksyttyjä nimeämiskäytäntöjä niin ei tule tällaisia sekaantumisongelmia.
Se on vielä helppoa, kun olet noin nuori ;D
.
-
Eli paikallinen slangi-ilmaisu.
Oikeastaan jargon- eikä slangi-, mutta totta kai. Esim. puolilainausmerkki ja heittomerkki (jotka olivat sanastojen hyväksymiä nimityksiä) olivat turhan kömpelöjä käyttää, kun piti vaikkapa puhelimitse neuvoa, mitä komentoriville kirjoitetaan, siksi merkistä tuli hipsu. Takakeno tosiaan tuli sitten käyttöön vain, koska se oli takaperoinen suhteessa jo olemassaolevaan kenoon.
UNIXin valitsimien edessä oleva yhdysmerkki taas tunnettiin yleensä miinuksena, mikä oli sikäli sopivaa, että pitkien valitsinnimien edessä oli usein plus (+) ennen kuin kaksoisyhdysmerkki (--) vakiintui – siis. esim. ”+help” eikä ”--help”.
Kannattaisi varmaan jossain vaiheessa päivittää oma termistö noudattamaan yleisesti hyväksyttyjä nimeämiskäytäntöjä niin ei tule tällaisia sekaantumisongelmia.
Siinä on vain se ongelma, ettei täysin yleisesti hyväksyttyjä käytäntöjä ole olemassakaan. Se, että esim. Korpela on saanut Unicode-nimiin ängetyksi vino- ja kenoviivan (vanhat suosikkinsa!), ei todista, että ne vieläkään sen yleisemmin ymmärrettäisiin juuri standardinmukaisella tavalla.
Käytännöt myös muuttuvat. Minulle esim. kovo edelleenkin tarkoittaa yleisesti ’laitteistoa’, mikä johtaa kaiken aikaa ongelmiin lasten kanssa, joille se merkitsee ’kiintolevyä’.