Como cortar todos os caracteres após o último '/'?
Esse texto
xxxx/x/xx/xx/xxxx/x/yyyyy
xxx/xxxx/xxxxx/yyy
deve retornar
xxxx/x/xx/xx/xxxx/x
xxx/xxxx/xxxxx
command-line
text-processing
Josef Klimuk
fonte
fonte
basename
edirname
faça isso já./
" se tornou "Como cortar todos os caracteres após o último '/'?" que é uma mudança de fraseado que mantém razoavelmente o significado, IMO. Na verdade, senti a parte "omitir o que é ..." ambígua: os exemplos parecem manter o que está antes do/
. O exemplo, deixa claro, de qualquer maneira.Respostas:
Se você deseja obter a "parte cortada"
Você pode usar
por exemplo.
resultado
(Nota: Isso usa a capacidade do sed de usar um separador diferente de /, neste caso |, no comando s)
Se você deseja obter o início da string:
Você pode usar
por exemplo.
resultado
fonte
#
vez de/
. Além disso, você pode usar a opção-r
se você não quiser escapar `\` de cada caractere especial:sed -r 's#(^.*)/.*$#\1#'
.Se você está cortando fora as extremidades das cordas,
dirname
pode caber a conta:Se você estiver tentando isolar a última parte da string, use
echo /$(basename "$str")
.fonte
dirname
ebasename
não são amplamente conhecidos, massed
eawk
são.cat text | basename
, não funciona. Portanto, uma solução adequada para a pergunta do OP usandodirname
ebasename
envolveriaxargs
etc.Expansão de parâmetros em
bash
Você pode usar a expansão de parâmetros
bash
, neste caso${parameter%word}
ondeword
esta/*
${parameter##word}
ondeword
esta*/
Exemplos:
Retire a última parte
Isso é descrito em
man bash
:Remova tudo, exceto a última parte
Você pode adicionar uma barra assim
para obter exatamente o que você queria em uma instância específica, de acordo com a pergunta editada. Mas a pergunta foi editada por várias pessoas depois disso e não é fácil saber o que você deseja agora.
Isso é descrito em
man bash
:fonte
Outra maneira é usar
grep
para exibir apenas a última barra por linha e o que segue:Explicação:
-o
dizgrep
para mostrar apenas a parte correspondente da linha em vez da linha inteira.O padrão
/[^/]*$
corresponde a uma barra literal/
seguida por qualquer caractere, exceto por uma barra[^/]
qualquer número de vezes*
até o final da linha$
.fonte
Só porque outros publicaram respostas mais "sãs", eis uma pergunta um tanto boba:
rev
inverte os caracteres em cada linha, por exemplo,abcd/ef/g
torna-seg/fe/dcba
. Em seguida,cut
corta o primeiro segmento. Finalmente, é revertida novamente.fonte
Solução clássica com
awk
, que trata/
como separador de campo para entrada e saída e define o último campo como string vazia (que é realmente "desreferenciando" aNF
variável número de campos ):Mais curto, como fedorqui apontou nos comentários:
Uma variação disso seria colocar o caminho no
awk
ambiente de execução, o que economizará o encanamento, mas tornará aawk
parte mais detalhada:fonte
NF--
? Desta forma, você avoud oprint
bla bla.Adicionando à resposta do egmont porque a pergunta foi editada ...
Use --complement se desejar remover o primeiro campo com -f1 .
Além disso, a questão não é clara sobre o que deve acontecer com entradas que não contêm barras. xxxx => xxxx ou xxxx => nada
fonte
--complement
opção antes e a página de manual é circular. Complemento significa complemento. Encontrei um bom tutorial de corte que o cobre em yourownlinux.com/2015/05// É como-v
emgrep
. Me dê tudo, exceto o que foi combinado.-f2-
é uma forma mais simples para-f1 --complement
.