Frage

Ich habe eine Datei, die diese Art von Pfaden enthält:

C:\bad\foo.c
C:\good\foo.c
C:\good\bar\foo.c
C:\good\bar\[variable subdir count]\foo.c

Und ich mag die folgende Datei erhalten:

C:\bad\foo.c
C:/good/foo.c
C:/good/bar/foo.c
C:/good/bar/[variable subdir count]/foo.c

Beachten Sie, dass der nicht passende Pfad sollte nicht geändert werden.

Ich weiß, wie dies für eine feste Anzahl von subdir mit sed zu tun, aber eine variable Anzahl gibt mir Mühe. Eigentlich würde ich habe viele s/x/y/ Ausdrücke verwenden (so viele wie die maximale Tiefe ... nicht sehr elegant).

Auch mit awk sein, aber diese Art von Magie ist jenseits meiner Fähigkeiten.

Zur Info, ich brauche diesen Trick einige gcov Binärdateien auf einer Cygwin-Plattform zu korrigieren.


ich mit binären Dateien zu tun habe; deshalb könnte ich die folgende Art von Daten hat:

bindata\bindata%bindataC:\good\foo.c

, die übersetzt werden sollen, wie:

bindata\bindata%bindataC:/good/foo.c

Der erste \ muss nicht übersetzt werden, trotz dass sie auf der gleichen Linie ist.

Allerdings habe ich gerade überprüfte meine .gcno Dateien, während diese die Bearbeitung von Text und es sieht aus wie alle Wege mit Nullen flankiert werden, so dass die meisten der Antworten sollen unter passen.

War es hilfreich?

Lösung

sed -e '/^C:\\good/ s/\\/\//g' input_file.txt

Andere Tipps

Ich würde Ihnen empfehlen, die cygpath Dienstprogramm schauen, die Pfadnamen von einem Format in ein anderes umwandelt. Zum Beispiel auf meiner Maschine:

$ cygpath `pwd`
/home/jericson

$ cygpath -w `pwd`
D:\root\home\jericson

$ cygpath -m `pwd`
D:/root/home/jericson

Hier ist eine Perl-Implementierung von dem, was Sie gefragt:

$ echo 'C:\bad\foo.c
C:\good\foo.c
C:\good\bar\foo.c
C:\good\bar\[variable subdir count]\foo.c' | perl -pe 's|\\|/|g if /good/'
C:\bad\foo.c
C:/good/foo.c
C:/good/bar/foo.c
C:/good/bar/[variable subdir count]/foo.c

Es funktioniert direkt mit dem String, so wird es überall arbeiten. Man könnte es mit cygpath kombinieren, aber es funktioniert nur auf Maschinen, die diesen Pfad haben:

perl -pe '$_ = `cygpath -m $_` if /good/'

(Da ich C nicht haben: \ gut auf meinem Rechner, erhalte ich eine Ausgabe wie C:goodfoo.c Wenn Sie einen echten Weg auf Ihrem Computer verwenden, es sollte richtig arbeiten.).

Sie wollen ‚/‘ für alle ‚\‘ ersetzen, sondern nur auf den Linien, die den guten Verzeichnispfad entsprechen. Sowohl sed und awk lassen Sie dies tun, indem ein LHS (Matching) Ausdruck aufweist, die nur die Zeilen mit den richtigen Weg nimmt.

Ein trivialer sed-Skript, dies zu tun würde wie folgt aussehen:

/[Cc]:\\good/ s/\\/\//g

Für eine Datei:

c:\bad\foo
c:\bad\foo\bar
c:\good\foo
c:\good\foo\bar

Sie erhalten die Ausgabe unten erhalten:

c:\bad\foo
c:\bad\foo\bar
c:/good/foo
c:/good/foo/bar

Hier ist, wie ich es in awk tun würde:

# fixpaths.awk
/C:\\good/ {
   gsub(/\\/,"/",$1);
   print $1 >> outfile;
}

Führen Sie dann den Befehl:

awk -f fixpaths.awk paths.txt; mv outfile paths.txt

Oder mit etwas Hilfe von good ol‘Bash:

#!/bin/bash

cat file | while read LINE
do
        if <bad_condition>
        then
                echo "$LINE" >> newfile
        else
                echo "$LINE" | sed -e "s/\\/\//g" >> newfile
        fi
done

try this

sed -re '/\\good\\/ s/\\/\//g' temp.txt

oder das

awk -F"\\" '{if($2=="good"){OFS="\/"; $1=$1;} print $0}' temp.txt

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top