Extrair uma palavra de uma string no shell script

1

Eu tenho uma string como $ sea = xyz-ajay-não-siddhart-ubidona-fdh-DMJK.UK.1.0-32133-Z-1.tgz

e eu quero extrair apenas DMJK.UK.1.0-32133-Z-1 e string de pesquisa será DMJK

Eu tentei como

echo $sea
y=${sea/\/*\//};
echo ${y/.*/};

mas não está funcionando, por favor ajude

Ajay Gautam
fonte

Respostas:

1

Como você deseja escolher o que remover e o que manter não está claro. Esta é uma das muitas maneiras de obter o resultado que você pede:

$ sea=xyz-ajay-no-siddhart-ubidone-fdh-DMJK.UK.1.0-32133-Z-1.tgz
$ sea2=${sea/*[[:lower:]]-/}; echo ${sea2%.*}
DMJK.UK.1.0-32133-Z-1

Alternativamente, isso inclui as partes que começam com DMJK e deixando de fora a final .tgz:

$ sea2=${sea/*DMJK/DMJK}; echo ${sea2%.tgz}
DMJK.UK.1.0-32133-Z-1

Essa mesma abordagem funciona mesmo se o .tgz não está presente:

$ sea=xyz-ajay-no-siddhart-ubidone-fdh-DMJK.UK.1.0-32133-Z-1
$ sea2=${sea/*DMJK/DMJK}; echo ${sea2%.tgz}
DMJK.UK.1.0-32133-Z-1
John1024
fonte
Muito obrigado, tenho que escolher de DMJK para .tgz
Ajay Gautam
@AjayGautam OK. Eu adicionei uma solução que remove tudo antes DMJK e também remove o final .tgz.
John1024
Desculpe incomodá-lo, sou muito novo para a expressão regular e, como extrair apenas DMJK.UK.1.0-32133-Z-1 xyz-ajay-não-siddhart-ubidone-fdh-DMJK.UK.1.0-32133-Z- 1 novamente para isso eu tenho que procurar DMJK e xyz-ajay-não-siddhart-ubidone-fdh-DMJK.UK.1.0-32133-Z-1 pode ser pasta
Ajay Gautam
@AjayGautam OK. Atualizei a resposta para adicionar esse exemplo.
John1024
é possível combinar estas duas afirmações em 1 e atribuir numa variável, e. sea ​​2 = $ {$ {sea / * DMJK / DMJK}%. tgz} Eu tentei, mas não está funcionando.
Ajay Gautam
0

Como você está determinando quais personagens extrair? Se os caracteres sempre aparecerem em lugares específicos na string, por exemplo se for uma string de tamanho fixo ou os caracteres necessários são os últimos 21 caracteres antes de um ponto e uma extensão de 3 caracteres, você pode usar um dos seguintes em um script Bash:

sea="xyz-ajay-no-siddhart-ubidone-fdh-DMJK.UK.1.0-32133-Z-1.tgz"

echo $sea
# If characters are always in positions 33 to 50
y=${sea:33:21}
echo $y

# If y always start 5 positions from the end and goes back 21 characters
# For negative numbers you need to put a space between the colon and the
# number
#
# Get the last 25 characters in the string
y=${sea: -25}
# Now discard the last 4, which are the dot and 3 character extension
y=${y:0:21}
echo $y
moonpoint
fonte
Nenhuma posição não é fixa
Ajay Gautam
0

Depende da maneira como sua variável pode parecer em outras instâncias.

Pode ser tão simples como:

echo $sea | cut -d '-' -f 7- | cut -d . -f -4

ou

echo $sea | sed 's#.*\(DMJK.*\).tgz#\1#g'
Sirex
fonte
Pequena modificação em questão: $ sea = xyz-ajay-no-siddhart-ubidone-fdh-DMJK.UK.1.0-32133-Z-1.tgz matchessadds.dsdsds.21212 ou $ sea = xyz-ajay-no-siddhart- ubidone-fdh-DMJK.UK.1.0-32133-Z-1.tar.bz2 matchessadds.dsdsds.21212, precisa extrair a partir do DMJK e antes de ".tgz" ou ".tar", tentei echo $ sea | (# DMJK. *) .t * # \ 1 # g ', mas falhado o / p deve ser DMJK.UK.1.0-32133-Z-1 no caso acima. Cadeia pode mudar na mosca, então o / p deve ser DMJK.UK.1.3.0-3213309-Z-13
Ajay Gautam
assim o / p deve ser DMJK.UK.1.3.0-3213309-Z-13, nenhuma outra coisa
Ajay Gautam