Questo è sicuramente un caso in cui si desidera utilizzare qualcosa di simile sed
(o awk
o perl
) anziché leggere una riga alla volta in un ciclo di shell. Questo non è il genere di cose che la shell fa bene o efficientemente.
Potrebbe risultare utile scrivere una funzione riutilizzabile. Ecco un semplice, anche se non funziona su testo completamente arbitrario (barre o metacaratteri delle espressioni regolari saranno confondere le cose):
function insertAfter # file line newText
{
local file="$1" line="$2" newText="$3"
sed -i -e "/^$line$/a"$'\\\n'"$newText"$'\n' "$file"
}
Esempio:
$ cat foo.txt
Now is the time for all good men to come to the aid of their party.
The quick brown fox jumps over a lazy dog.
$ insertAfter foo.txt \
"Now is the time for all good men to come to the aid of their party." \
"The previous line is missing 'bjkquvxz.'"
$ cat foo.txt
Now is the time for all good men to come to the aid of their party.
The previous line is missing 'bjkquvxz.'
The quick brown fox jumps over a lazy dog.
$
fonte
2012-11-09 22:11:16
che non funziona; hai bisogno di una barra retroversa e di una nuova riga nella stringa di comando sed dopo 'a', non uno spazio. –