Aqui estão algumas opções:
-
basenamecomo sugerido por Stephane$ basename /1a/ftproot/archive/ABC/20140111_PR1_018_SALESDOC_ITEM_001.dat 20140111_PR1_018_SALESDOC_ITEM_001.datbasenamefaz parte decoreutilse simplesmente retira o caminho dos nomes dos arquivos. -
awk$ printf "/1a/ftproot/archive/ABC/20140111_PR1_018_SALESDOC_ITEM_001.dat" | awk -F'/' '{print $NF}'A opção
-Fparaawkdefine o separador de campo. Então, definimos isso como/e depois imprimimos o último campo ($NF). -
cut$ printf "/1a/ftproot/archive/ABC/20140111_PR1_018_SALESDOC_ITEM_001.dat" | cut -d '/' -f 6-dé o separador de campo e-f 6informacutpara imprimir apenas o quinto campo.Esta é uma abordagem muito limitada, uma vez que requer que você saiba o número de campos com antecedência. Uma maneira melhor seria usar
rev(que inverte sua entrada) para fazer o último campo primeiro, depoiscutpara obter o primeiro campo e entãorevpara recuperá-lo do jeito que estava:$ printf "/1a/ftproot/archive/ABC/20140111_PR1_018_SALESDOC_ITEM_001.dat\n" | rev | cut -d/ -f1 | rev -
Perl
$ printf "/1a/ftproot/archive/ABC/20140111_PR1_018_SALESDOC_ITEM_001.dat\n" | perl -pe 's/.+?([^\/]+)$/$1/;'O
-psinalizador dizperlpara imprimir cada linha de entrada depois de executar qualquer script que seja dado como-e. Nesse caso, simplesmente informamosperlpara substituir tudo até o trecho mais longo de caracteres que não são/. Como esse é o Perl, existem várias maneiras de fazer isso:$ printf "/1a/ftproot/archive/ABC/20140111_PR1_018_SALESDOC_ITEM_001.dat\n" | perl -F/ -ane 'print $F[$#F]'O sinalizador
-ainformaperla se comportar comoawk, ele dividirá automaticamente cada linha de entrada na matriz@F. Por isso, definimos o delimitador de campo como/com-Fe depois imprimimos o último elemento da matriz($F[$#F]). O-nfaz com queperlfaça um loop sobre sua linha de entrada por linha. -
grep$ printf "/1a/ftproot/archive/ABC/20140111_PR1_018_SALESDOC_ITEM_001.dat" | grep -Po '[^/]+$'O
-Pativa os PCREs e o-osignifica "imprima apenas a string correspondente". Então, dizemos agreppara procurar a string mais longa de não-/até o final da string de entrada ($). -
shell
$ foo="/1a/ftproot/archive/ABC/20140111_PR1_018_SALESDOC_ITEM_001.dat"; $ printf "${foo##*/}\n"Isso tira proveito das habilidades de manipulação de strings do shell. Especificamente, a construção
${var##pattern}excluirá a correspondência mais longa depatternda frente de$var. Então,##*/significa apagar tudo até o último/. -
sed$ printf "/1a/ftproot/archive/ABC/20140111_PR1_018_SALESDOC_ITEM_001.dat\n" | sed 's/.*\///'sedsubstituirá tudo até o último/.