Entrada
dir/foo
Saída
dir./
Então, eu preciso:
echo 'dir/foo' | MAGIC
P:O que é MAGIC
? (algo como um cut
+ sed
unido: 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 dirname
comread
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./
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./