Obtenha tudo após a primeira ocorrência de substring

0

Existem muitas soluções para este trabalho em um único caractere, mas não para substrings. Eu tenho uma solução próxima, mas exclui tudo após a última ocorrência de uma substring:

$ echo pkg-new-pkg-20180925-090719.x86_64 | sed -n -e "s/^.*pkg-//p"
20180925-090719.x86_64

O que eu quero é:

$ echo pkg-new-pkg-20180925-090719.x86_64 | ???
new-pkg-20180925-090719.x86_64

A substring na qual estou dividindo é pkg- neste caso. Alguma idéia?

    
por Daniel Porteous 26.09.2018 / 17:33

2 respostas

5

Em uma variável:

var=pkg-new-pkg-20180925-090719.x86_64
printf '%s\n' "${var#*pkg-}"

${var#pattern} remove a parte inicial mais curta que corresponde ao padrão ( ${var##pattern} da parte mais longa).

Em um fluxo de entrada de texto:

sed 's/pkg-/\
/;s/.*\n//'

Isso substitui a ocorrência primeira de pkg- por um caractere de nova linha (um caractere que não ocorre no espaço padrão) e, em seguida, remove tudo até esse caractere de nova linha. Algumas implementações sed também permitem escrever sed 's/pkg-/\n/;s/.*\n//' , embora não seja portátil nem padrão.

Com ast-open sed (também funciona com ssed -R ):

sed -E 's/.*?pkg-//'

com perl :

perl -pe 's/.*?pkg-//'

Em que .*? é a versão não mesclada de .* .

    
por 26.09.2018 / 17:46
0

Eu fiz os 2 métodos abaixo mencionados

Primeiro método

     echo "pkg-new-pkg-20180925-090719.x86_64"| sed "s/pkg-//"
new-pkg-20180925-090719.x86_64

Segundo método

echo "pkg-new-pkg-20180925-090719.x86_64"| awk -F "-" '{$1="";print $0}'| sed 's/^ //g'| sed "s/ /-/g"

new-pkg-20180925-090719.x86_64
    
por 26.09.2018 / 18:30

Tags