sed sostituire con variabile con più righe

Sto cercando di sostituire una parola con un testo che si estende su più righe. So che posso semplicemente usare il carattere di nuova riga \ n per risolvere questo problema, ma voglio mantenere la stringa “pulita” da qualsiasi formattazione indesiderata.

L’esempio sottostante ovviamente non funziona:

read -r -d '' TEST <<EOI a b c EOI sed -e "s/TOREPLACE/${TEST}/" file.txt 

Qualche idea su come ottenere ciò SENZA modificare la parte che inizia con read e termina con EOI?

Una domanda interessante ..

Questo potrebbe avvicinarti a una soluzione per il tuo caso d’uso.

 read -r -d '' TEST < 

Spero che aiuti.

Dato che stai usando Bash, puoi usarlo per sostituire \n per le nuove righe:

 sed -e "s/TOREPLACE/${TEST//$'\n'/\\n}/" file.txt 

Per essere adeguatamente robusti, ti consigliamo di sfuggire a / , & e \ , anche:

 TEST="${TEST//\\/\\\\}" TEST="${TEST//\//\\/}" TEST="${TEST//&/\\&}" TEST="${TEST//$'\n'/\\n}" sed -e "s/TOREPLACE/$TEST/" file.txt 

Se la tua corrispondenza è per un’intera linea e stai usando GNU sed, allora potrebbe essere più semplice usare il suo comando r invece:

 sed -e $'/TOREPLACE/{;z;r/dev/stdin\n}' file.txt <<<"$TEST" 

difficile … ma la mia soluzione sarebbe: –

 read -r -d '' TEST < 

Importante: assicurati di utilizzare i backtick corretti, virgolette singole, virgolette doppie e spazi altrimenti non funzionerà.

Puoi semplicemente scrivere lo script come segue:

 sed -e 's/TOREPLACE/a\ b\ c\ /g' file.txt 

Un po ‘criptico, ma funziona. Si noti inoltre che il file non verrà modificato sul posto a meno che non si utilizzi l’opzione -i .