opendatasicilia / tansignari

"T'ansignari e t'appeddiri"
http://tansignari.opendatasicilia.it
Creative Commons Attribution 4.0 International
18 stars 10 forks source link

[bash] sostituire una stringa di un file di testo con l'output di un comando #247

Closed dennisangemi closed 1 year ago

dennisangemi commented 1 year ago

Ciao a tutt! Mi sono incartato da un po' di tempo su una questione che non riesco a risolvere nè con ChatGPT nè con google ;)

Ho un file markdown metadata.md così fatto

## 🕮 License
Quest'opera è distribuita con Licenza [Creative Commons Attribution 4.0 ](https://creativecommons.org/licenses/by/4.0/) (CC-BY-4.0)

## 👥 Contributors
{{{contributors}}}

Devo sostituire la stringa {{{contributors}}} con l'output di questo comando

cat datapackage.yaml | yq '[.contributors[] | {Name: .title, Role: .role, Email: .email}]' | mlr --j2m cat

che è una tabella del tipo

| Name | Role | Email |
| --- | --- | --- |
| Chiara Adornetto | author | chiara.adornetto@tiscali.it |
| Dennis Angemi | maintainer | dennisangemi@gmail.com |

Ho provato ad usare sed in questo modo:

sed -i "s/{{{contributors}}}/$(cat datapackage.yaml | yq '[.contributors[] | {Name: .title, Role: .role, Email: .email}]' | mlr --j2m cat)/" metadata.md

ma ottengo l'errore:

sed: -e expression #1, char 44: unterminated `s' command

Ho usato un comando analogo senza problemi. Temo che qui i caratteri della tabella in md facciano fare le bizze a sed.

questi i due file che possono tornare utile: tansignari.zip

Grazie in anticipo! <3

aborruso commented 1 year ago

Quando c'è roba multiline, con caratteri "strani", uso perl

#!/bin/bash

out=$(cat datapackage.yaml | yq '[.contributors[] | {Name: .title, Role: .role, Email: .email}]' | mlr --j2m cat)

perl -i -p -e 's/{{{contributors}}}/'"$out"'/g' metadata.md

Ma si potrà fare pure con sed

aborruso commented 1 year ago

E se è un progetto pubblico, facci sapere dove potremo vederne l'output :)

aborruso commented 1 year ago

Ma si potrà fare pure con sed

Con sed riesco a farlo passando da un file temporaneo

<datapackage.yaml yq '[.contributors[] | {Name: .title, Role: .role, Email: .email}]' | mlr --j2m cat >temp.txt

sed -i -e '/{{{contributors}}}/r temp.txt' -e '//d' metadata.md

# if file exists, delete it
if [ -f temp.txt ]; then
    rm temp.txt
fi
dennisangemi commented 1 year ago

Grazie mille @aborruso! Sei più forte di ChatGPT ;)

Ho usato perl così come scrivi tu e sembra tutto perfetto.

E se è un progetto pubblico, facci sapere dove potremo vederne l'output :)

Sono ancora in fase sperimentale ma non appena ci sarà qualcosa di decente rendo pubblico ;) avrai già intuito di cosa si tratta

dennisangemi commented 1 year ago

Eccola https://tansignari.opendatasicilia.it/ricette/bash/sostituire_stringa_con_output/

Grazie ancora @aborruso, chiudo

dennisangemi commented 1 year ago
dennisangemi commented 1 year ago

@aborruso ho reso pubblico questo repo https://github.com/dennisangemi/frictionless2md. È ancora una bozza ma funzionicchia.

aborruso commented 1 year ago

@aborruso ho reso pubblico questo repo https://github.com/dennisangemi/frictionless2md. È ancora una bozza ma funzionicchia.

molto molto carino!!!!

E mi rende orgoglioso