br sed + remove o primeiro diretório do caminho

2

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
    
por maihabunash 17.07.2014 / 12:33

3 respostas

5

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 17.07.2014 / 12:49
3

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.

    
por 17.07.2014 / 12:58
2

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
    
por 17.07.2014 / 12:56