¿Cómo insertar una línea en un documento de texto justo antes de la línea que contiene texto en bash?

¿Cómo insertar una línea en un documento de texto justo antes de la línea que contiene texto en bash?

Tengo una variable say $strToInserty tengo un archivo file.html. Me pregunto cómo encontrar la última aparición </head>e insertar una nueva línea antes de la línea y llenarla con $strToInsertcontenido.

Esto es lo que tengo:

GACODE="UA-00000000-1"

if [ "$2" = "" ]
then
    echo "Usage: $0 <url to extract doxygen generated docs into> <GA tracker code if needed>"
    echo "Using default"
else
    GACODE = $2
fi

GASTR="<script>var _gaq = _gaq || [];_gaq.push([\'_setAccount\', \'$GACODE\']);_gaq.push([\'_trackPageview\']);(function() {var ga = document.createElement('script'); ga.type = 'text/javascript\'; ga.async = true;ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);})();</script>"

pero cuando lo intento:

sed -i 's#</head>#'$GASTR'\n</head>#' header.html

Yo obtengo:

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

¿Qué pasa con mi código?

Respuesta1

sed -i "s#</head>#$strToInsert\n</head>#" file.html

pero no estoy seguro de que "última aparición" signifique que puede tener varios </head>en su archivo.

Respuesta2

sed "/<\/head>/i\
$strToInsert" file.html

Esto insertará la nueva línea antescada </head>, pero ¿por qué tienes más de uno?

Respuesta3

cat "$file" #(before)
1
2 </head>
3
4 </head>
5
6 </head>

strToInsert="hello world"
lnum=($(sed -n '/<\/head>/=' "$file"))  # make array of line numbers
((lnum>0)) && sed -i "${lnum[$((${#lnum[@]}-1))]}i \
                      $strToInsert" "$file"

cat "$file" #(after)
1
2 </head>
3
4 </head>
5
hello world
6 </head>

información relacionada