Ubuntu Suomen keskustelualueet

Ubuntun käyttö => Ohjelmointi, palvelimet ja muu edistyneempi käyttö => Aiheen aloitti: Dost - 04.01.11 - klo:15.48

Otsikko: bash: sanan korvaaminen toisen tiedoston sisältöllä?
Kirjoitti: 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:
Lainaus
The quick brown fox jumps over the lazy dog

file2.txt:
Lainaus
weasel

Tuloksen pitää olla tiedostossa file.txt:
Lainaus
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:
Koodia: [Valitse]
#!/bin/bash
sed -i 's/dog/weasel/g' file.txt

Jos bash ei taivu siihen, niin osaako python? Voi ehdottaa pythoniakin.
Otsikko: Vs: bash: sanan korvaaminen toisen tiedoston sisältöllä?
Kirjoitti: SuperOscar - 04.01.11 - klo:16.53
Onnistunee tuo sedillä ja jopa bashillakin, mutta äkkiseltään näin pythonilla:

Koodia: [Valitse]
#!/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:

Koodia: [Valitse]
#!/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 :)
Otsikko: Vs: bash: sanan korvaaminen toisen tiedoston sisältöllä?
Kirjoitti: UbunTux - 04.01.11 - klo:17.27
Noin jää jäljelle vain weasel
Koodia: [Valitse]
$ echo 'The quick brown fox jumps over the lazy dog' | sed 's/\(.*\)dog\(.*\)/weasel/g'
weasel

Laitetaanv ähän lisää vinkkiä pätkimisestä

Koodia: [Valitse]
$ echo 'Kirjoitan Ubuntun keskustelupalstalle' | sed 's/\(.*\)Ubuntun\(.*\)/Suoli24\2/g'
Suoli24 keskustelupalstalle
ja

Koodia: [Valitse]
echo 'Kirjoitan Ubuntun keskustelupalstalle' | sed 's/\(.*\)Ubuntun\(.*\)/\1Suoli24/g'
Kirjoitan Suoli24

ja

Koodia: [Valitse]
echo 'Kirjoitan Ubuntun keskustelupalstalle' | sed 's/\(.*\)Ubuntun\(.*\)/\1Suoli24\2/g'
Kirjoitan Suoli24 keskustelupalstalle
Otsikko: Vs: bash: sanan korvaaminen toisen tiedoston sisältöllä?
Kirjoitti: Tomin - 04.01.11 - klo:17.45
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:
Koodia: [Valitse]
#!/bin/bash
cat file2.txt |xargs -I{} sed -i 's/dog/{}/g' file.txt
Otsikko: Vs: bash: sanan korvaaminen toisen tiedoston sisältöllä?
Kirjoitti: Dost - 04.01.11 - klo:17.56
Kiitos neuvoista! Toimivat bash ja python versiot niin kuin pitää. Harjoittelen lisää.
Otsikko: Vs: bash: sanan korvaaminen toisen tiedoston sisältöllä?
Kirjoitti: HACY - 05.01.11 - klo:05.56
Alkutilanne on siis tämä

Koodia: [Valitse]
$ 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:

Koodia: [Valitse]
$ echo 'cat file1.txt'
cat file1.txt
$ echo `cat file1.txt`
weasel

Eli sovellettuna

Koodia: [Valitse]
$ 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'
Otsikko: Vs: bash: sanan korvaaminen toisen tiedoston sisältöllä?
Kirjoitti: salai - 05.01.11 - klo:09.10
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
Otsikko: Vs: bash: sanan korvaaminen toisen tiedoston sisältöllä?
Kirjoitti: ajaaskel - 05.01.11 - klo:12.44
Lainaus
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ä.
 
Otsikko: Vs: bash: sanan korvaaminen toisen tiedoston sisältöllä?
Kirjoitti: SuperOscar - 05.01.11 - klo:14.29
"kenoheittomerkkien"

Per. ”takahipsut”. Vrt. ”keno” (/), ”takakeno” (\) ja ”hipsu” = ’ (eli heittomerkki tai puolilainausmerkki).

Lainaus
"tyhjää tilaa" (taitaa olla huono käännös engl. "white space")

Tähän on ehdotettu ”tyhje”, ”tyhjemerkit”.
Otsikko: Vs: bash: sanan korvaaminen toisen tiedoston sisältöllä?
Kirjoitti: ajaaskel - 05.01.11 - klo:14.36
Ihan kuvaava nimi kyllä mutta:

Takahipsut  ˵ jotain ˵

Takayksittäishipsut ʽ jotain ʽ

Takaheittomerkit ?

?   :)
Otsikko: Vs: bash: sanan korvaaminen toisen tiedoston sisältöllä?
Kirjoitti: HACY - 05.01.11 - klo:14.57
... 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.

  .
Otsikko: Vs: bash: sanan korvaaminen toisen tiedoston sisältöllä?
Kirjoitti: HACY - 05.01.11 - klo:15.03
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.

  .
Otsikko: Vs: bash: sanan korvaaminen toisen tiedoston sisältöllä?
Kirjoitti: SuperOscar - 05.01.11 - klo:16.22
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.
Otsikko: Vs: bash: sanan korvaaminen toisen tiedoston sisältöllä?
Kirjoitti: ajaaskel - 05.01.11 - klo:22.03
Sisältääköhän SFS 4175 mitään tuohon liittyvää ?
Otsikko: Vs: bash: sanan korvaaminen toisen tiedoston sisältöllä?
Kirjoitti: HACY - 06.01.11 - klo:07.42
... 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.
Otsikko: Vs: bash: sanan korvaaminen toisen tiedoston sisältöllä?
Kirjoitti: ajaaskel - 06.01.11 - klo:12.54
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)
Otsikko: Vs: bash: sanan korvaaminen toisen tiedoston sisältöllä?
Kirjoitti: SuperOscar - 06.01.11 - klo:13.02
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ä.
Otsikko: Vs: bash: sanan korvaaminen toisen tiedoston sisältöllä?
Kirjoitti: HACY - 06.01.11 - klo:16.08
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.
Otsikko: Vs: bash: sanan korvaaminen toisen tiedoston sisältöllä?
Kirjoitti: SuperOscar - 06.01.11 - klo:16.46
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.

Lainaus
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.
Otsikko: Vs: bash: sanan korvaaminen toisen tiedoston sisältöllä?
Kirjoitti: HACY - 06.01.11 - klo:17.06
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

  .
Otsikko: Vs: bash: sanan korvaaminen toisen tiedoston sisältöllä?
Kirjoitti: SuperOscar - 06.01.11 - klo:17.28
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ä’.