Salve,
avrei bisogno di comporre uno script in grado di sostituire una stringa di testo con una stringa formata da due righe, per esempio:

testo
pcmanfm --set-wallpaper="path"</br>
testo

deve diventare:

testo
pcmanfm --set-wallpaper="path"
pcmanfm --wallpaper-mode=center
testo

Come posso fare?

chiesto 15 Set '13, 19:58

nicoweb313's gravatar image

nicoweb313
25136

modificato 15 Set '13, 20:54

enzotib's gravatar image

enzotib ♦♦
14.0k112186


Puoi fare quello che chiedi con il comando sed.

Un esempio funzionante è questo:

echo "riga unica" | sed 's/riga unica/riga 1\nriga 2/g'

Per la sintassi precisa ti rimando al manuale (da terminale, man sed) e ai numerosi esempi su internet, ma in questo caso ti basti sapere che sed prende in input un espressione e la esegue per ogni riga di testo che gli viene passata.

In questo caso sed esegue la regola s, che sta per substitute ovvero sostituisci.

Dopo la regola c'è un separatore, io ho usato / ma sed permette di scegliere il separatore che preferisci, basta che tu sia coerente nell'utilizzarlo.

Dopo il separatore trovi la stringa "riga unica" che è ciò che sed cercherà di sostituire. Segue un altro separatore.

A questo punto trovi "riga 1\nriga 2" che è la stringa che sed andrà a sostituire alla precedente. Nota che il "\n" è il codice per il newline.

Infine troviamo un altro separatore e il carattere g, che indica a sed di sostituire tutte le occorrenze di "riga unica" che trova nella stessa stringa di input, e non solo la prima.

coll. permanente

ha risposto 15 Set '13, 20:48

Marco's gravatar image

Marco
1.5k4930

modificato 15 Set '13, 22:45

enzotib's gravatar image

enzotib ♦♦
14.0k112186

Guardando la sintassi di sed dovrei aggiungere il nome del file alla fine, scrivendo questo:
sed 's/pcmanfm --set-wallpaper="${background}"/pcmanfm --set-wallpaper="${background}"\npcmanfm --set-wallpaper="${background}"/g' file.txt
ottengo in output quello che desidero ma il file non viene modificato. Con cat file.txt infatti vedo che il file di partenza non ha subito modifiche. Sbaglio qualcosa nell'ordine dei comandi forse?

(15 Set '13, 22:21) nicoweb313 nicoweb313's gravatar image
1

@nicoweb313: sed non è uno strumento pensato per modificare files, ma stream di dati, da qui il suo nome sed = stream editor. Però la versione di sed fornita da Ubuntu è GNU sed, che ha una opzione -i (equivalente a --in-place) che consente di modificare il file.

(15 Set '13, 22:40) enzotib ♦♦ enzotib's gravatar image

Risolto con -i ! grazie infinite!

(15 Set '13, 22:42) nicoweb313 nicoweb313's gravatar image

@nicoweb313: accetta la risposta

(15 Set '13, 22:47) enzotib ♦♦ enzotib's gravatar image
La tua risposta
abilita/disabilita anteprima

Segui questa domanda

Via email:

Una volta eseguito l'accesso potrai iscriverti a tutti gli aggiornamenti qui

Via RSS:

Risposte

Risposte e commenti

Basi di markdown

  • *corsivo* o __corsivo__
  • **grassetto** o __grassetto__
  • collegamento:[testo](http://url.com/ "titolo")
  • immagine?![alt testo](/path/img.jpg "titolo")
  • elenco numerato: 1. Foo 2. Bar
  • per aggiungere un'interruzione di riga, aggiungi due spazi a fine riga e premi «Invio»
  • è supportato anche semplice HTML

Tag:

×93

domanda posta: 15 Set '13, 19:58

domanda visualizzata: 2,322 volte

ultimo aggiornamento: 15 Set '13, 22:47

Chiedi è un servizio di supporto gestito da Ubuntu-it. Contattaci!

powered by OSQAPostgreSQL database
Ubuntu e Canonical sono marchi registrati da Canonical Ltd.