Cut+Sed-Funktion verbunden

Cut+Sed-Funktion verbunden

Eingang

dir/foo

Ausgabe

dir./

Also, ich brauche:

echo 'dir/foo' | MAGIC

Q:Was ist MAGIC? (so etwas wie ein cut+ sedverbunden :D)

Antwort1

Hier stehen Ihnen mehrere Optionen zur Verfügung. Ich würde eine Parametererweiterung bevorzugen:

foo=dir/foo
echo "${foo%/*}./"

Eine weitere Option ist awk:

echo "dir/foo" | awk -F/ '{ print $1"./" }'

Antwort2

Eine weitere Verwendung vonread

IFS=/ read a b <<<"dir/foo"
echo "$a./"

Funktioniert nicht, wenn „dir/foo“ eigentlich „/home/user/foo“ ist.

Antwort3

Sie können auch dirnamemit verwendenread

read foo
echo "$(dirname "$foo")./"

und dirnamemit xargs.

echo "$(xargs dirname)./"

Beispielverwendung mit einer Funktion:

$ MAGIC() { echo "$(xargs dirname)./"; }
$ echo 'dir/foo' | MAGIC
dir./

Antwort4

Ich bin mir nicht sicher, was Sie hier versuchen. Wollen Sie wirklich ein wörtliches .? Das fühlt sich an wie einXY-Problem.

Eine einfache Möglichkeit, das zu tun, wonach Sie anscheinend fragen, ist die Verwendung vondirname:

$ echo $(dirname "dir/foo")./
dir./

Die Hauptvorteile von dirnamesind, dass es mit Leerzeichen umgehen kann und Teil der GNU-Coreutils ist, sodass es in allen GNU-Systemen installiert wird. Außerdem kann es mit beliebig langen Pfaden umgehen:

$ echo $(dirname "aa/bb bb/cc/foo")./
aa/bb bb/cc./

Sie können den Trick von @EvanTeitelman verwenden, um daraus eine Funktion zu machen:

$ MAGIC() { echo $(dirname "$1")./; }
$ MAGIC 'dir/foo'
dir./
$ MAGIC 'dir/foo bar/foo'
dir/foo bar./

verwandte Informationen