imprimir tudo depois de uma barra

3

Descobri como imprimir tudo antes de uma barra, mas preciso imprimir tudo depois de uma barra. Eu tenho uma string como blablabal/important e preciso imprimir apenas important . Como devo modificar a linha abaixo para imprimir tudo depois de uma barra e não antes?

sed 's:/[^/]*$::'
    
por Iris Pader 05.12.2015 / 17:28

5 respostas

6

Como você mencionou em seu comentário que o arquivo tem apenas uma barra, por que não usar apenas awk ?

Exemplo:

 ❱ echo "blablabal/important" | awk -F'/' '{print $1}'
blablabal
 ❱ echo "blablabal/important" | awk -F'/' '{print $2}'
important
    
por 05.12.2015 / 17:33
6

Basta excluir tudo até a última barra:

$ echo "blablabal/important" | sed 's:.*/::'
important

Também funciona com várias barras:

$ echo "blablabal/not/ver/interesting/important" | sed 's:.*/::'
important
    
por 05.12.2015 / 18:32
5

Parece que as outras respostas estão assumindo que você tem várias linhas de dados em um arquivo, que devem ser processadas. Nesse caso, sed ou awk (ou possivelmente cut ) seriam as melhores ferramentas para processar todas as linhas de uma só vez.

No entanto, se você tiver apenas uma linha em uma variável shell (supondo que esteja usando bash ), poderá usar expansões de shell para obter o resultado desejado, sem precisar gerar utilitários em processos externos:

$ var="interesting/bla/blablabal/important"
$ 
$ # everything after the first slash:
$ echo "${var#*/}"
bla/blablabal/important
$ # everything after the last slash:
$ echo "${var##*/}"
important
$ # everything before the first slash:
$ echo "${var%%/*}"
interesting
$ # everything before the last slash:
$ echo "${var%/*}"
interesting/bla/blablabal
$ 
    
por 06.12.2015 / 01:37
1

Isso deve funcionar:

echo "blablabal/important" | sed 's:[^/]*/\(.*\)::'

A primeira parte [^/]* , corresponde a tudo, MAS uma barra, então temos uma barra literal / e "corresponde a tudo" .* dentro de parênteses com escape \(.*\) . Os parênteses com escape estão lá para "salvar" o resultado correspondente, o que significa que ele conterá tudo após a primeira barra neste caso. O refere-se ao primeiro grupo correspondente, neste caso, temos apenas um grupo, porque existe apenas um par \(...\) .

Em sed , o caractere digitado depois do s será o delimitador. É uma prática comum usar / como delimitador, mas nesse caso é mais fácil usar outra coisa, embora seja possível usar uma barra também.

    
por 05.12.2015 / 17:33
1
 
sed -et -e's|/|&\n|;//D' <in >out

... imprimirá tudo após a primeira barra em qualquer linha que contenha uma, ou então imprimirá qualquer outra não modificada. Se você eliminar o // , ele apenas imprimirá as linhas que ele modificar.

Você pode precisar usar um literal \n ewline no lugar do n no escape \n , dependendo da sua versão sed .

Além disso, se você especificar uma contagem de ocorrências ...

sed -et -e's|/|&\n|num;/\n/D'

... você pode excluir até a barra num em uma linha sem afetar qualquer linha que não contenha pelo menos num barras.

    
por 05.12.2015 / 19:05