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
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:/[^/]*$::'
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
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
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
$
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.
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.
Tags text-processing sed