1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

bash script mit sed: Bestimmte Zeilen ersetzen

Dieses Thema im Forum "Sonstige Sprachen" wurde erstellt von Buba235, 17. September 2012.

  1. Buba235

    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 (Text):
    1.  
    2. while read line
    3. do
    4.     if [[ "$line" =~ "<ProjectReference Include=" ]]; then
    5.         projects=${line}
    6.         projects="${projects#\<ProjectReference Include=\"}"
    7.         projects="${projects#\    <ProjectReference Include=\"}"
    8.         projects="${projects%\vcxproj\">}"
    9.         projects=`cygpath -u $projects`
    10.  
    11.         PROJECT=($(perl -MFile::Spec -e 'print File::Spec->abs2rel("'$projects'","'$CURRENT'")'))
    12.         sed -i -e "s#\(<ProjectReference Include=\"\)\(.*\)#\1${PROJECT}vcxproj\">#" VS_DATEI.vcxproj
    13.     fi
    14. done < VS_DATEI.vcxproj
    15.  
    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
  2. Buba235

    Buba235 Erfahrenes Mitglied

    Hallo!

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

    Code (Text):
    1.  
    2. # read in the whole file and find the <AdditionalIncludeDirectories> tag
    3. # to get the include list
    4.  i=0
    5. while read line
    6. do
    7.     if [[ "$line" =~ "<ProjectReference Include=" ]]; then
    8.         projects=${line}
    9.         projects="${projects#\<ProjectReference Include=\"}"
    10.         projects="${projects#\    <ProjectReference Include=\"}"
    11.  
    12.         # get the complete line
    13.         TMP[$i]=$projects
    14.         projects="${projects%\vcxproj\">}"
    15.         projects=`cygpath -u $projects`
    16.  
    17.         PROJECT=($(perl -MFile::Spec -e 'print File::Spec->abs2rel("'$projects'","'$CURRENT'")'))
    18.         PROJ_PATHS[$i]=$PROJECT
    19.         i=$((i+1))
    20.     fi
    21. done < VS_DATEI.vcxproj
    22.  
    23. # insert all relative paths in the file
    24. typeset -i j=0 max=${#PROJ_PATHS[*]}
    25. while (( j < max ))
    26. do
    27.     LINE="<ProjectReference Include=\"${TMP[$j]}"
    28.     REPL="<ProjectReference Include=\"${PROJ_PATHS[$j]}vcxproj\">"
    29.     sed -i -e "s#${LINE}#${REPL}#" VS_DATEI.vcxproj
    30.     j=$((j+1))
    31. done
    32.  

Diese Seite empfehlen