función cut+sed unida

función cut+sed unida

Aporte

dir/foo

Producción

dir./

así que necesito:

echo 'dir/foo' | MAGIC

P:Qué es MAGIC? (algo así como un cut+ sedunido :D)

Respuesta1

Tienes algunas opciones aquí. Mi preferencia sería hacia una expansión de parámetros:

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

Otra opción es awk:

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

Respuesta2

Otro uso deread

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

No funcionará si "dir/foo" es en realidad "/home/user/foo"

Respuesta3

Puedes usar también dirnameconread

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

y dirnamecon xargs.

echo "$(xargs dirname)./"

Uso de ejemplo con una función:

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

Respuesta4

No estoy seguro de lo que estás intentando hacer aquí. ¿Realmente quieres un literal .? Esto se siente como unproblema xy.

De todos modos, una forma sencilla de hacer lo que parece estar pidiendo es utilizardirname:

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

La principal ventaja dirnamees que puede manejar espacios y es parte de GNU coreutils, por lo que se instalará en todos los sistemas GNU. También puede tratar con caminos arbitrariamente largos:

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

Puedes usar el truco de @EvanTeitelman para convertir esto en una función:

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

información relacionada