função cut+sed unida

função cut+sed unida

Entrada

dir/foo

Saída

dir./

Então, eu preciso:

echo 'dir/foo' | MAGIC

P:O que é MAGIC? (algo como um cut+ sedunido: D)

Responder1

Você tem algumas opções aqui. Minha preferência seria por uma expansão de parâmetros:

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

Outra opção é awk:

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

Responder2

Outro uso deread

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

Não funcionará se "dir/foo" for na verdade "/home/user/foo"

Responder3

Você pode usar também dirnamecomread

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

e dirnamecom xargs.

echo "$(xargs dirname)./"

Exemplo de uso com uma função:

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

Responder4

Não tenho certeza do que você está tentando fazer aqui. Você realmente quer um literal .? Isso parece umProblema XY.

De qualquer forma, uma maneira simples de fazer o que você parece estar pedindo é usardirname:

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

As principais vantagens de dirnameé que ele pode lidar com espaços e faz parte do GNU coreutils, portanto será instalado em todos os sistemas GNU. Também pode lidar com caminhos arbitrariamente longos:

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

Você pode usar o truque do @EvanTeitelman para transformar isso em uma função:

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

informação relacionada