Tente:
echo "/mnt/VPfig/Amer/AR4/Celtel/files/COM.txt" | sed 's|^/[^/]*||'
que me deu:
/VPfig/Amer/AR4/Celtel/files/COM.txt
Ele procura o primeiro /
seguido por quantos não forem /
s e substitui-os por uma string vazia.
Por favor, informe sobre como remover o primeiro diretório de um caminho por sed
,
(o inverso pf que basename
faz).
Por exemplo
echo "/mnt/VPfig/Amer/AR4/Celtel/files/COM.txt" | sed ...
Eu deveria receber:
/VPfig/Amer/AR4/Celtel/files/COM.txt
Em um shell POSIX:
$ x='/mnt/VPfig/Amer/AR4/Celtel/files/COM.txt'
$ printf "/%s\n" "${x#/*/}"
/VPfig/Amer/AR4/Celtel/files/COM.txt
Explicação
A expansão de parâmetros ${x#/*/}
remove o componente principal do caminho com o dois /
s incluindo-o e o printf
retorna um /
inicial.
A maneira mais simples seria remover a string mais curta de caracteres que não são /
desde o início da string.
Na maioria das linguagens de expressões regulares, [ ]
os uma classe de caracteres que corresponde a qualquer um dos colchetes. [abc]
corresponderá a a
ou b
ou c
. [^ ]
é uma classe de caractere negada , combinando qualquer coisa, exceto os caracteres nela contidos. Portanto, [^/]*
corresponderá à string mais longa de caracteres que não sejam /
. Um ^
no início de uma expressão regular faz corresponder apenas no início da cadeia de entrada. Combinando estes, você pode fazer:
$ echo "/mnt/VPfig/Amer/AR4/Celtel/files/COM.txt" | sed 's/^\/[^/]*//'
/VPfig/Amer/AR4/Celtel/files/COM.txt
Ou, você pode definir o delimitador de campo de entrada do awk como /
e imprimir tudo menos o último campo:
$ echo "/mnt/VPfig/Amer/AR4/Celtel/files/COM.txt" |
awk -F/ '{for(i=3;i<=NF;i++){printf "/%s",$i};print ""}'
Ou você pode usar alguns truques Perl:
$ echo "/mnt/VPfig/Amer/AR4/Celtel/files/COM.txt" |
perl -F/ -lane 'print "/",join "/",@F[2..$#F]'
/VPfig/Amer/AR4/Celtel/files/COM.txt
ou, algum truque melhor em Perl como sugerido por @Joseph R. :
$ echo "/mnt/VPfig/Amer/AR4/Celtel/files/COM.txt" | perl -pe
perl -pe 's{^/.*?(?=/)}{}'
ou simplesmente:
$ echo "/mnt/VPfig/Amer/AR4/Celtel/files/COM.txt" | perl -pe 's#/[^/]+/#/#'
/VPfig/Amer/AR4/Celtel/files/COM.txt
Por fim, você também pode usar o poder das expressões regulares do Perl com grep
:
$ echo "/mnt/VPfig/Amer/AR4/Celtel/files/COM.txt" | grep -oP '/[^/]+?\K/.*'
/VPfig/Amer/AR4/Celtel/files/COM.txt
Tags sed shell-script filenames