Ubuntu Suomen keskustelualueet
Ubuntun käyttö => Ohjelmointi, palvelimet ja muu edistyneempi käyttö => Aiheen aloitti: K-Veikko - 08.03.22 - klo:11.07
-
Haluan korvata jokaisen "kissa" -merkkijonon oman skriptin antamalla tuloksella. Olkoon se skripti tässä esimerkissä
shuf -i 1-100000 -n 1
Sed'illä se onnistuu
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
-
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ä:
echo "kissa koira kissa hiiri" | awk '{for (i=1; i<=NF; i++) sub(/kissa/, 1+int(rand()*100000), $i)} 1'
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=","
-
Ei ratkennut vielä tällä.
Jos haluan suorittaa oman skriptin tuolle sanalle kissa, vaikkapa
$HOME/bin/OmaSkripti
niin mihin sijoitan tuon skriptin osoitteen tuossa awk'ssa?
-
Tähän tapaan pitäisi onnistua:
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'
-
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ä.
[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:
<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>