cut + sed function joined

0

Entrada

dir/foo

Resultado

dir./

então eu preciso:

echo 'dir/foo' | MAGIC

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

    
por gasko peter 07.10.2013 / 22:28

4 respostas

6

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"./" }'
    
por 07.10.2013 / 22:34
4

Outro uso de read

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

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

    
por 07.10.2013 / 22:58
4

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./
    
por 07.10.2013 / 22:47
4

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./
    
por 07.10.2013 / 23:26

Tags