extração de string bash

3

Gostaria de extrair o 2º campo da última parte das seguintes strings:

foo_1.103.debug_xx.ver21-inc-1          --> string extracted "debug_xx"
foo_1.103.1.0.release_32_xx.ver21-inc-1 --> string extracted "release_32_xx"
foo_1.103.1.0.release_xx.ver21-inc-1    --> string extracted "release_xx"

Qualquer ajuda será apreciada.

    
por icasimpan 27.12.2012 / 10:46

4 respostas

1

Use ${VAR%PATTERN} para remover o sufixo correspondente ao último campo e, em seguida, ${NEWVAR##PATTERN} para remover o prefixo correspondente a todos, exceto o último campo restante.

all_but_last_field=${mystring%.*}
second_to_last_field=${all_but_last_field##*.}

Você precisa armazenar a string em uma variável e armazenar o resultado intermediário em uma variável também, você não pode encadear diretamente as expansões (você pode em zsh, mas não em bash).

    
por 27.12.2012 / 22:35
5

com bash puro:

IFS='.' read -a p <<< 'foo_1.103.1.0.release_32_xx.ver21-inc-1'
echo "${p[${#p[@]}-2]}"

Você pode fazer isso mais facilmente com awk :

awk -F. '{print$(NF-1)}' <<< 'foo_1.103.1.0.release_32_xx.ver21-inc-1'

Caso suas strings sejam analisadas, você ainda poderá fazê-lo com awk :

awk -F. 'BEGIN{for(i=1;i<ARGC;i++){$0=ARGV[i];print$(NF-1)}}' foo*
    
por 27.12.2012 / 10:53
2

Um comando sed para fazer isso:

sed 's/foo_[0-9.]*\([^.]*\).*//' inputfile

Assumindo, é claro, que inputfile contenha suas strings, cada uma em sua própria linha (como seu exemplo parece ser). Se disser que você está usando nomes de arquivos, a inserção dos resultados de ls no sed também funcionará.

    
por 27.12.2012 / 15:55
-2

assumindo que são arquivos:

ls foo*|awk -F. '{print $3}'

    
por 27.12.2012 / 10:55