Kirjoittaja Aihe: sed random substitute  (Luettu 2802 kertaa)

K-Veikko

  • Käyttäjä
  • Viestejä: 309
    • Profiili
sed random substitute
« : 08.03.22 - klo:11.07 »
Haluan korvata jokaisen "kissa" -merkkijonon oman skriptin antamalla tuloksella. Olkoon se skripti tässä esimerkissä
Koodia: [Valitse]
shuf -i 1-100000 -n 1Sed'illä se onnistuu
Koodia: [Valitse]
echo "kissa koira kissa hiiri" | sed "s/kissa/`shuf -i 1-100000 -n 1`/g"mutta ei aivan: nyt se korvaa jokaisen merkkijonon "kissa" samalla tuloksella.

?
Kuinka korvata niin, että jokainen korvattava sana saa uuden ja siis erilaisen koodin
?

Sii EI näin: 65164 koira 65164 hiiri
Vaan näin: 84942 koira 3069 hiiri

nm

  • Käyttäjä
  • Viestejä: 16242
    • Profiili
Vs: sed random substitute
« Vastaus #1 : 08.03.22 - klo:13.00 »
sed on hankala tuohon, koska sillä on vaikea suorittaa funktiota jokaisen matchin kohdalla. Esimerkissäsi komentotulkki suorittaa shuf-komennon yhden kerran, ennen kuin sed edes käynnistetään.

awk:lla onnistuu esimerkiksi näin, jos syöte koostuu erillisistä kentistä:
Koodia: [Valitse]
echo "kissa koira kissa hiiri" | awk '{for (i=1; i<=NF; i++) sub(/kissa/, 1+int(rand()*100000), $i)} 1'
Lainaus
23618 koira 10585 hiiri

Tämä siis korvaa jokaisessa kentässä vain yhden kissa-sanan satunnaisella kokonaisluvulla, mutta satunnainen luku vaihtuu kuitenkin jokaisessa kentässä.

Oletuksena awk:ssa kenttien erottimena on yksi tai useampi välilyönti tai tabulaattori (säännöllinen lauseke [ \t]+), mutta erottimen voi vaihtaa esimerkiksi pilkuksi parametreilla -F "," -vOFS=","

« Viimeksi muokattu: 08.03.22 - klo:13.02 kirjoittanut nm »

K-Veikko

  • Käyttäjä
  • Viestejä: 309
    • Profiili
Vs: sed random substitute
« Vastaus #2 : 08.03.22 - klo:19.27 »
Ei ratkennut vielä tällä.

Jos haluan suorittaa oman skriptin tuolle sanalle kissa, vaikkapa
Koodia: [Valitse]
$HOME/bin/OmaSkriptiniin mihin sijoitan tuon skriptin osoitteen tuossa awk'ssa?

nm

  • Käyttäjä
  • Viestejä: 16242
    • Profiili
Vs: sed random substitute
« Vastaus #3 : 08.03.22 - klo:20.11 »
Tähän tapaan pitäisi onnistua:

Koodia: [Valitse]
echo "kissa koira kissa hiiri" | awk '{for (i=1; i<=NF; i++) {cmd="$HOME/bin/OmaSkripti"; cmd | getline value; sub(/kissa/, value, $i); close(cmd)}} 1'

K-Veikko

  • Käyttäjä
  • Viestejä: 309
    • Profiili
Vs: sed random substitute
« Vastaus #4 : 12.03.22 - klo:20.54 »

Suuret kiitokset. Asia on vaivannut jo pitemmän aikaa. Uskon että ratkaisu löytyi vaikka en ole vielä toden teolla kokeillut.


Minulla on manuaalisesti suoritettava skripti, joka tekee merkkijonosta markdown-pandoc -linkin sanaan itseensä. Tällä tavoin voi keskelle tekstiä lisätä ankkureita, joissa on   vapaamuotoinen "pop-up" selitys. Näin on helppo viitata juuri tiettyyn kohtaan tekstissä.


Koodia: [Valitse]
[merkkijonosta markdown-pandoc -linkin](#merkkijonost-5f0a85 "Vapaamuotoinen pop-up teksti tähän"){#merkkijonost-5f0a85}

Tuo ulkoisen skriptin käyttö tuli ajankohtaiseksi, kun yritin "yhdellä klikkauksella" merkitä pitkästä runosta jokaisen kappaleen / säkeistön ensimmäisen sanan tuolla koodilla. --- Vähän sama ajatus kuin Kalevalassa, jossa jokainen rivi on numeroitu ilmeisesti sielläkin juuri viittauksien helpottamiseksi.



Alusta ei näköjään tue html'ää, joten laitan vain koodia:
Koodia: [Valitse]
<p>skripti, joka tekee <a href="#merkkijonost-36d5c7" id=merkkijonost-36d5c7 title="Vapaamuotoinen pop-up teksti tähän">merkkijonosta markdown-pandoc -linkin</a> sanaan itseensä</p>