DOS auf UNIX-Pfad Substitution innerhalb einer Datei
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.
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