Zeilenende in Linux und Mac

Zeilenende in Linux und Mac

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 – sedzumindest die Anweisung –, aber wenn Sie wissen möchten, was im sedMusterbereich von geschieht, sollten Sie lsich das ansehen:

sed 'l;s|/$||;l'

Ich denke, Sie könnten das Ganze sedso 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 /)

verwandte Informationen