bash script mit sed: Bestimmte Zeilen ersetzen

Buba235

Erfahrenes Mitglied
Hallo Leute!

Ich habe ein kleines Problem, von dem ich momentan nicht weiß, wie ich es lösen soll. Vielleicht könnt ihr mir helfen.
Hier mal mein Szenario: Ich habe ein kleines bash script, mit dem ich eine Datei (genauer eine Visual Studio vcxproj Datei) einlesen und bestimmte Zeilen suche. Wenn ich die besagten Zeilen efunden habe, dann hole ich mir einen bestimmten Inhalt dieser Zeile und speichere ihn in einer Variable. Diese Variable (das ist ein absoluter Pfad) verändere ich gleich darauf und möchte sie in eben dieser gefundenen Zeile gleich wieder einsetzen. Das ist auch mein Problem.

Hier erst mal mein Code:

Code:
while read line
do
    if [[ "$line" =~ "<ProjectReference Include=" ]]; then
        projects=${line}
        projects="${projects#\<ProjectReference Include=\"}"
        projects="${projects#\    <ProjectReference Include=\"}"
        projects="${projects%\vcxproj\">}"
        projects=`cygpath -u $projects`

        PROJECT=($(perl -MFile::Spec -e 'print File::Spec->abs2rel("'$projects'","'$CURRENT'")'))
        sed -i -e "s#\(<ProjectReference Include=\"\)\(.*\)#\1${PROJECT}vcxproj\">#" VS_DATEI.vcxproj
    fi
done < VS_DATEI.vcxproj

Das was ich in obigen Code mache klappt ja wunderbar, nur leider auf alle vorkommenden Zeilen mit dem "Marker" <ProjectReference Include=". Ist ja eigentlich auch logisch, da sed ja alle Vorkommen ersetzt, aber ich brauche leider eine Zeile für Zeile "Ersetzung" mit dem jeweiligen modifizierten Pfad. Kann mir da jemand helfen?

Danke schon mal
Buba
 
Hallo!

Okay ichhabe eine Lösung gefunden. Mein Ansatz nur bestimmte Zeilen zu ändern ist folgender:

Code:
# read in the whole file and find the <AdditionalIncludeDirectories> tag
# to get the include list
 i=0
while read line
do
    if [[ "$line" =~ "<ProjectReference Include=" ]]; then
        projects=${line}
        projects="${projects#\<ProjectReference Include=\"}"
        projects="${projects#\    <ProjectReference Include=\"}"

        # get the complete line
        TMP[$i]=$projects
        projects="${projects%\vcxproj\">}"
        projects=`cygpath -u $projects`

        PROJECT=($(perl -MFile::Spec -e 'print File::Spec->abs2rel("'$projects'","'$CURRENT'")'))
        PROJ_PATHS[$i]=$PROJECT
        i=$((i+1))
    fi
done < VS_DATEI.vcxproj

# insert all relative paths in the file
typeset -i j=0 max=${#PROJ_PATHS[*]}
while (( j < max ))
do
    LINE="<ProjectReference Include=\"${TMP[$j]}"
    REPL="<ProjectReference Include=\"${PROJ_PATHS[$j]}vcxproj\">"
    sed -i -e "s#${LINE}#${REPL}#" VS_DATEI.vcxproj
    j=$((j+1))
done
 
Zurück