Cortar uma string usando sed

1

Eu tenho um comando que me envia uma lista com o seguinte padrão

exp_70_T8_s1
exp_71_T8_s5
exp_72_T8_s10
exp_73_T10_s1
exp_74_T10_s5
exp_75_T10_s10
...

Como posso obter os números depois de "_T" e "_s", respectivamente, usando sed ou algo semelhante em bash?
A saída deve se parecer com isso

8
8
8
10
10
10

e

1
5
10
1
5
10

para _T e _s , respectivamente

A primeira parte do meu comando é assim:

for f in $(find . -name "someFile.txt" | sort); do echo $f; done | grep /someFolderName/ 

Basicamente eu gostaria de adicionar o comando ao dado acima.

    
por mcExchange 05.04.2016 / 16:31

2 respostas

6

Usando sed com o agrupamento de padrões para capturar as partes desejadas:

your_command | sed -r 's/.*_T([0-9]+)_s([0-9]+)$/ /'
  • ([0-9]+) é o primeiro grupo capturado, [0-9] corresponde a qualquer número entre 0-9 e + indica uma ou mais correspondências do token anterior [0-9] neste caso

  • ([0-9]+) é o segundo grupo capturado

  • No padrão de substituição, os dois grupos capturados são referenciados por e , respectivamente.

Exemplo:

$ cat file.txt 
exp_70_T8_s1
exp_71_T8_s5
exp_72_T8_s10
exp_73_T10_s1
exp_74_T10_s5
exp_75_T10_s10

$ sed -r 's/.*_T([0-9]+)_s([0-9]+)/ /' file.txt 
8 1
8 5
8 10
10 1
10 5
10 10

Altere o padrão de substituição para atender sua necessidade, por exemplo, sem espaço:

your_command | sed -r 's/.*_T([0-9]+)_s([0-9]+)//' file.txt 

Responda à pergunta editada:

Para _T :

your_command | grep -Po '.*_T\K\d+'    ## Using grep
your_command | sed -r 's/.*_T([0-9]+).*//'   ## Using sed

Para _s :

your_command | grep -Po '.*_s\K\d+$'    ## Using grep
your_command | sed -r 's/.*_s([0-9]+)$//'    # Using sed
    
por heemayl 05.04.2016 / 16:39
5

Usando o AWK:

command | awk -F_T\|_s '{print }'
command |
    awk -F_T\|_s '
        {
            print 
        }
    '

e:

command | awk -F_T\|_s '{print }'
command |
    awk -F_T\|_s '
        {
            print 
        }
    '

Onde command é o comando que gera o arquivo.

  • -F_T\|_s : define _T e _s como separadores de campos de entrada;
  • {print } : imprime o segundo campo.
  • {print $N} : imprime o terceiro campo.
% cat file
exp_70_T8_s1
exp_71_T8_s5
exp_72_T8_s10
exp_73_T10_s1
exp_74_T10_s5
exp_75_T10_s10
% cat file | awk -F_T\|_s '{print }'
8
8
8
10
10
10
% cat file | awk -F_T\|_s '{print }'
1
5
10
1
5
10
    
por kos 05.04.2016 / 16:59