Você tem algumas opções aqui. Minha preferência seria para uma expansão de parâmetro:
foo=dir/foo
echo "${foo%/*}./"
Outra opção é o awk:
echo "dir/foo" | awk -F/ '{ print $1"./" }'
Entrada
dir/foo
Resultado
dir./
então eu preciso:
echo 'dir/foo' | MAGIC
P: O que é MAGIC
? (algo como um cut
+ sed
aderido: D)
Outro uso de read
IFS=/ read a b <<<"dir/foo"
echo "$a./"
Não funcionará se "dir / foo" for realmente "/ home / user / foo"
Você também pode usar dirname
com read
read foo
echo "$(dirname "$foo")./"
e dirname
com xargs
.
echo "$(xargs dirname)./"
Exemplo de uso com uma função:
$ MAGIC() { echo "$(xargs dirname)./"; }
$ echo 'dir/foo' | MAGIC
dir./
Não sei o que você está tentando fazer aqui. Você realmente quer um literal .
? Isso parece um problema XY .
De qualquer forma, uma maneira simples de fazer o que você parece estar perguntando é usar dirname
:
$ echo $(dirname "dir/foo")./
dir./
As principais vantagens do dirname
é que ele pode lidar com espaços e faz parte do GNU coreutils, então 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./