Ubuntu Suomen keskustelualueet

Ubuntun käyttö => Ohjelmointi, palvelimet ja muu edistyneempi käyttö => Aiheen aloitti: K-Veikko - 08.03.22 - klo:11.07

Otsikko: sed random substitute
Kirjoitti: K-Veikko - 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
Otsikko: Vs: sed random substitute
Kirjoitti: nm - 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=","

Otsikko: Vs: sed random substitute
Kirjoitti: K-Veikko - 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?
Otsikko: Vs: sed random substitute
Kirjoitti: nm - 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'
Otsikko: Vs: sed random substitute
Kirjoitti: K-Veikko - 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>