extrair texto entre dois jogos diferentes

6

Estou tentando extrair texto entre a primeira correspondência específica (_ e -). Por exemplo, eu preciso pegar o número 5 abaixo:

MQSeriesRuntime_5-U200491-7.5.0-4.x86_64

Eu tentei o awk field seperator (awk -F), mas isso é o que me faz todo o texto depois de _.

    
por MO12 11.07.2017 / 19:36

6 respostas

8

Você só precisa ser criativo sobre seu separador de campo:

$ awk 'BEGIN {FS="_|-"} {print $2}' input
5

O truque com FS é que não é uma string; é uma expressão regular.

Para explicar um pouco mais detalhadamente conforme você solicita abaixo:

Um script awk pode definir um bloco de código denominado BEGIN , que é executado antes que qualquer dado recebido seja processado.

Eu uso este bloco de código para definir o separador de campo ( FS ) usando uma expressão regular como um hífen ( - ) ou sublinhado ( _ ).

O próximo bloco de código, {print $2} , imprimirá o segundo campo (isto é, a segunda sequência de caracteres delimitada pelo separador até aqui, /-|_/ ), que é o 5 que você procura. Um bloco de código sem prefixo será executado para cada registro lido por awk .

    
por 11.07.2017 / 19:42
4

Ao usar o parâmetro -F , é possível obter uma solução ligeiramente mais curta.

$ awk -F'-|_' '{print $2}' input
5
    
por 11.07.2017 / 21:55
1

sed abordagem alternativa:

sed 's/^[^_-]*_\([^_-]*\)-.*//' file
5
    
por 11.07.2017 / 22:54
0

Python

Com o uso de <<< para redirecionar a string desejada para o interpretador stdin do python e com re.split() , podemos remover o segundo item na lista resultante de itens que estão sendo divididos nos dois separadores.

$ python -c 'import re,sys; print(re.split("-|_",sys.stdin.readline())[1])'  <<< "MQSeriesRuntime_5-U200491-7.5.0-4.x86_64"                          
5 

Alternativamente, poderíamos apenas fornecer a string como argumento de linha de comando e operar em sys.argv[1] :

$ python3 -c 'import re,sys; print(re.split("-|_",sys.argv[1])[1])' "MQSeriesRuntime_5-U200491-7.5.0-4.x86_64"                                       
5

Isso funciona com o Python 2 e 3. Se quisermos processar um arquivo e extrair a entrada de cada linha dessa maneira, podemos fazer o seguinte:

$ cat input.txt
MQSeriesRuntime_5-U200491-7.5.0-4.x86_64
MQSeriesRuntime_2-U200491-7.5.0-4.x86_64
MQSeriesRuntime_6-U200491-7.5.0-4.x86_64
$ python3 -c 'import re,sys; print("\n".join(map(lambda x: re.split("-|_",x)[1], sys.stdin.readlines())))'  < input.txt                              
5
2
6
    
por 12.07.2017 / 04:47
0

Inspirado pelo link :

echo MQSeriesRuntime_5-U200491-7.5.0-4.x86_64 | perl -n -e '/_([^-]+)/ && print $1'
    
por 12.07.2017 / 05:22
0

Poderia usar cut com o primeiro delimitador _ obter o segundo collumn e, em seguida, cut novamente com - delimiter para obter o primeiro collumn.

echo MQSeriesRuntime_5-U200491-7.5.0-4.x86_64 | cut -d"_" -f2 | cut -d"-" -f1 
    
por 16.07.2017 / 00:48

Tags