Wie fügt man in Bash eine Zeile in ein Textdokument direkt vor der Zeile ein, die Text enthält?

Wie fügt man in Bash eine Zeile in ein Textdokument direkt vor der Zeile ein, die Text enthält?

Ich habe eine Variable $strToInsertund eine Datei file.html. Ich frage mich, wie ich das letzte Vorkommen von finden </head>und vor der Zeile mit dieser eine neue Zeile einfügen und sie mit $strToInsertInhalt füllen kann?

Hier ist, was ich habe:

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

aber wenn ich es versuche:

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

Ich bekomme:

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

Was ist mit meinem Code nicht in Ordnung?

Antwort1

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

</head>aber ich bin nicht sicher, ob „letzter Auftritt“ bedeutet, dass Sie mehrere in Ihrer Datei haben können ?

Antwort2

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

Dadurch wird die neue Zeile vorjeden </head>, aber warum hast du mehr als eine?

Antwort3

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>

verwandte Informationen