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
.