Como inserir uma linha em um documento de texto logo antes da linha que contém algum texto no bash?

Como inserir uma linha em um documento de texto logo antes da linha que contém algum texto no bash?

Eu tenho uma variável digamos $strToInserte tenho um arquivo file.html. Gostaria de saber como encontrar a última aparência </head>e inserir uma nova linha antes da linha e preenchê-la com $strToInsertconteúdo?

Aqui está o que eu tenho:

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>"

mas quando tento:

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

Eu recebo:

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

O que há de errado com meu código?

Responder1

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

mas não tenho certeza se "última aparição" significa que você pode ter vários </head>em seu arquivo.

Responder2

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

Isso irá inserir a nova linha antestodo </head>, mas por que você tem mais de um?

Responder3

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>

informação relacionada