Kirjoittaja Aihe: bash: sanan korvaaminen toisen tiedoston sisältöllä?  (Luettu 7555 kertaa)

Dost

  • Käyttäjä
  • Viestejä: 725
    • Profiili
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.
« Viimeksi muokattu: 04.01.11 - klo:16.05 kirjoittanut Dost »

SuperOscar

  • Käyttäjä
  • Viestejä: 4060
  • Ocatarinetabellatsumtsum!
    • Profiili
    • Legisign.org
Vs: bash: sanan korvaaminen toisen tiedoston sisältöllä?
« Vastaus #1 : 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 :)
« Viimeksi muokattu: 04.01.11 - klo:17.15 kirjoittanut SuperOscar »
pöytäkone 1, NUC: openSUSE Leap 15.6, kannettavat 1–3: Debian GNU/Linux 12; pöytäkone 2: openSUSE Tumbleweed; RPi 1: FreeBSD 14-RELEASE; RPi 2: LibreELEC 11

UbunTux

  • Käyttäjä
  • Viestejä: 2046
  • KubunTux
    • Profiili
Vs: bash: sanan korvaaminen toisen tiedoston sisältöllä?
« Vastaus #2 : 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
« Viimeksi muokattu: 04.01.11 - klo:17.40 kirjoittanut UbunTux »
KDE neon
Uudempaa KDE:tä Ubuntulla

Tomin

  • Palvelimen ylläpitäjä
  • Käyttäjä / moderaattori+
  • Viestejä: 11481
    • Profiili
    • Tomin kotisivut
Vs: bash: sanan korvaaminen toisen tiedoston sisältöllä?
« Vastaus #3 : 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
Automaattinen allekirjoitus:
Lisäisitkö [RATKAISTU] ketjun ensimmäisen viestin aiheeseen ongelman ratkettua, kiitos.

Dost

  • Käyttäjä
  • Viestejä: 725
    • Profiili
Vs: bash: sanan korvaaminen toisen tiedoston sisältöllä?
« Vastaus #4 : 04.01.11 - klo:17.56 »
Kiitos neuvoista! Toimivat bash ja python versiot niin kuin pitää. Harjoittelen lisää.

HACY

  • Käyttäjä
  • Viestejä: 16
    • Profiili
Vs: bash: sanan korvaaminen toisen tiedoston sisältöllä?
« Vastaus #5 : 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'

salai

  • Käyttäjä
  • Viestejä: 2126
    • Profiili
Vs: bash: sanan korvaaminen toisen tiedoston sisältöllä?
« Vastaus #6 : 05.01.11 - klo:09.10 »
Löytyi myös tuollainen suositus:
Why is $(...) preferred over `...` (backticks)?

Eli on kai selvempää kirjoittaa näin:
sed -i -e s/dog/$(cat file1.txt)/ file.txt

ajaaskel

  • Palvelimen ylläpitäjä
  • Käyttäjä
  • Viestejä: 3401
    • Profiili
Vs: bash: sanan korvaaminen toisen tiedoston sisältöllä?
« Vastaus #7 : 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ä.
 
Autamme ilolla ja ilmaiseksi omalla ajallamme.  Ethän vaadi, uhoa tai isottele näin saamasi palvelun johdosta.

SuperOscar

  • Käyttäjä
  • Viestejä: 4060
  • Ocatarinetabellatsumtsum!
    • Profiili
    • Legisign.org
Vs: bash: sanan korvaaminen toisen tiedoston sisältöllä?
« Vastaus #8 : 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”.
pöytäkone 1, NUC: openSUSE Leap 15.6, kannettavat 1–3: Debian GNU/Linux 12; pöytäkone 2: openSUSE Tumbleweed; RPi 1: FreeBSD 14-RELEASE; RPi 2: LibreELEC 11

ajaaskel

  • Palvelimen ylläpitäjä
  • Käyttäjä
  • Viestejä: 3401
    • Profiili
Vs: bash: sanan korvaaminen toisen tiedoston sisältöllä?
« Vastaus #9 : 05.01.11 - klo:14.36 »
Ihan kuvaava nimi kyllä mutta:

Takahipsut  ˵ jotain ˵

Takayksittäishipsut ʽ jotain ʽ

Takaheittomerkit ?

?   :)
« Viimeksi muokattu: 05.01.11 - klo:14.38 kirjoittanut ajaaskel »
Autamme ilolla ja ilmaiseksi omalla ajallamme.  Ethän vaadi, uhoa tai isottele näin saamasi palvelun johdosta.

HACY

  • Käyttäjä
  • Viestejä: 16
    • Profiili
Vs: bash: sanan korvaaminen toisen tiedoston sisältöllä?
« Vastaus #10 : 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 tuolla käytetään termejä vinoviiva ja kenoviiva.

  .

HACY

  • Käyttäjä
  • Viestejä: 16
    • Profiili
Vs: bash: sanan korvaaminen toisen tiedoston sisältöllä?
« Vastaus #11 : 05.01.11 - klo:15.03 »
Löytyi myös tuollainen suositus:
Why is $(...) preferred over `...` (backticks)?

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.

  .

SuperOscar

  • Käyttäjä
  • Viestejä: 4060
  • Ocatarinetabellatsumtsum!
    • Profiili
    • Legisign.org
Vs: bash: sanan korvaaminen toisen tiedoston sisältöllä?
« Vastaus #12 : 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.
pöytäkone 1, NUC: openSUSE Leap 15.6, kannettavat 1–3: Debian GNU/Linux 12; pöytäkone 2: openSUSE Tumbleweed; RPi 1: FreeBSD 14-RELEASE; RPi 2: LibreELEC 11

ajaaskel

  • Palvelimen ylläpitäjä
  • Käyttäjä
  • Viestejä: 3401
    • Profiili
Vs: bash: sanan korvaaminen toisen tiedoston sisältöllä?
« Vastaus #13 : 05.01.11 - klo:22.03 »
Sisältääköhän SFS 4175 mitään tuohon liittyvää ?
Autamme ilolla ja ilmaiseksi omalla ajallamme.  Ethän vaadi, uhoa tai isottele näin saamasi palvelun johdosta.

HACY

  • Käyttäjä
  • Viestejä: 16
    • Profiili
Vs: bash: sanan korvaaminen toisen tiedoston sisältöllä?
« Vastaus #14 : 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 (myös kauttaviiva)
http://fi.wikipedia.org/wiki/Kenoviiva

Takakenoviivaa ei ole olemassakaan.

ajaaskel

  • Palvelimen ylläpitäjä
  • Käyttäjä
  • Viestejä: 3401
    • Profiili
Vs: bash: sanan korvaaminen toisen tiedoston sisältöllä?
« Vastaus #15 : 06.01.11 - klo:12.54 »
Autamme ilolla ja ilmaiseksi omalla ajallamme.  Ethän vaadi, uhoa tai isottele näin saamasi palvelun johdosta.

SuperOscar

  • Käyttäjä
  • Viestejä: 4060
  • Ocatarinetabellatsumtsum!
    • Profiili
    • Legisign.org
Vs: bash: sanan korvaaminen toisen tiedoston sisältöllä?
« Vastaus #16 : 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ä.
pöytäkone 1, NUC: openSUSE Leap 15.6, kannettavat 1–3: Debian GNU/Linux 12; pöytäkone 2: openSUSE Tumbleweed; RPi 1: FreeBSD 14-RELEASE; RPi 2: LibreELEC 11

HACY

  • Käyttäjä
  • Viestejä: 16
    • Profiili
Vs: bash: sanan korvaaminen toisen tiedoston sisältöllä?
« Vastaus #17 : 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.

SuperOscar

  • Käyttäjä
  • Viestejä: 4060
  • Ocatarinetabellatsumtsum!
    • Profiili
    • Legisign.org
Vs: bash: sanan korvaaminen toisen tiedoston sisältöllä?
« Vastaus #18 : 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.
pöytäkone 1, NUC: openSUSE Leap 15.6, kannettavat 1–3: Debian GNU/Linux 12; pöytäkone 2: openSUSE Tumbleweed; RPi 1: FreeBSD 14-RELEASE; RPi 2: LibreELEC 11

HACY

  • Käyttäjä
  • Viestejä: 16
    • Profiili
Vs: bash: sanan korvaaminen toisen tiedoston sisältöllä?
« Vastaus #19 : 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

  .