
Ich analysiere eine Textdatei und suche nach einem Pfad, der nach einer Zeile geschrieben wird, die mit "output" beginnt. Die Zeile lautet ungefähr so:
output xyz/mypath/
und ich möchte extrahierenxyz/mypath
ohneder letzte Schrägstrich.
Unter Mac OS X (BSD) und Linux erhalte ich unterschiedliche Ergebnisse, wenn ich den Pfad mit diesem
basepath=cat $basefile | grep -e ^output\ | cut -d" " -f2 | rev | sed 's@/$@@' | rev
Der schwierige Teil scheint zu sein
sed 's@/$@@
was auf dem Mac funktioniert, unter Linux jedoch nicht. Umgekehrt, wenn ich
sed 's@/@@
es funktioniert unter Linux, nicht unter Mac (BSD).
Der Trick scheint mit dem Zeilenende-Zeichen „$“ zusammenzuhängen, das anders verwaltet wird (vielleicht auf der Ebene „cat“). Gibt es einen Vorschlag, dies so zu umgehen, dass sowohl die Mac- als auch die Linux-Konsole damit zurechtkommen?
Antwort1
Ich habe keinen einfachen Zugriff auf eine OSX-Maschine, aber Ihr Ansatz ist sowieso unnötig komplex. Machen Sie stattdessen einfach so etwas (abhängig von Ihrer tatsächlichen Eingabe):
basepath=$(grep ^output "$basefile" | awk '{print $NF}' | sed 's/[/]$//'
oder
basepath=$(awk '/^output/{print $2}' "$basefile" | sed 's/[/]$//')
oder auch
basepath=$(grep -oP '^output\s+\K.+(?=/)' "$basefile")
oder
basepath=$(perl -lne 'print $1 if /^output\s+(.+)\//' "$basefile";
Antwort2
Soweit ich das beurteilen kann, sollte das unter Linux so funktionieren, wie es ist – sed
zumindest die Anweisung –, aber wenn Sie wissen möchten, was im sed
Musterbereich von geschieht, sollten Sie l
sich das ansehen:
sed 'l;s|/$||;l'
Ich denke, Sie könnten das Ganze sed
so machen:
basepath=$(sed '/^output /!d;s|||;s|/$||' <"$basefile")
Antwort3
Ich würde vorschlagen
sed -n '/^output / {s///; s,\(.*\)/,\1,p}'
das sollte unter GNU und OSX sed funktionieren.
Der leere reguläre Ausdruck in s///
verwendet den vorherigen regulären Ausdruck erneut ( /^output /
)