Retorna a palavra antes de uma palavra correspondente usando sed

3

Eu estou tentando extrair e imprimir a palavra que ocorre antes de uma palavra específica que eu estou combinando. Como exemplo,

There are 12 processes running.

Aqui estou usando o sed para pesquisar a palavra processes e gostaria apenas de imprimir 12 .

Isso é possível usando sed ?

    
por Peter 05.01.2017 / 01:28

3 respostas

3

Se você só precisa lidar com essa linha, você pode usar o comando sed

sed -e 's/.* \([[:digit:]]\{1,\}\) processes running\.//'

Para uma abordagem um pouco mais robusta, o script a seguir aceitará entradas arbitrárias e responderá apenas se algo corresponder

sed -ne 's/.* \([[:digit:]]\{1,\}\) processes running\.//p'
    
por 05.01.2017 / 01:56
0

Em vez de usar uma substituição sed complicada, você poderia usar apenas uma pesquisa de grep de string fixa e cut :

$ grep -F 'processes' file | cut -d ' ' -f 3
    
por 05.01.2017 / 14:21
0

Como eu posso entender, você só precisa encontrar qualquer palavra (no caso comum) e imprimir a palavra antes.

Solução em GNU sed :

sed -rn 's/(^|(.* ))([^ ]*) YOUR_WORD(( .*)|$)//; T; p; q' 

Explicação

-r é estendido ao GNU regexp;

-n é o comando para não imprimir;

(^|(.* )) - prefixo antes da palavra que você deseja imprimir. Pode ser o início da linha ( ^ ) ou ( | ) caracteres de espaço final ( (.* ) );

([^ ])*) - palavra que será impressa ( );

YOUR_WORD - substitua por palavra, depois da palavra que você encontrar. (Como «correr» depois de «processo»);

(( .*)|$) - fim da linha após as palavras, final ( $ ) ou espaço e alguns caracteres;

é encontrado palavra;

T é «pula para o fim se a substituição não for bem sucedida», extensão GNU. Irá saltar para o fim do script para cada linha, que não contém YOUR_WORD como não primeira palavra;

p é «buffer de impressão», imprime a palavra encontrada (se T não funcionou nesta linha);

q é o comando para parar sed execução, porque já encontramos a palavra (não saltou com T ) e não precisamos encontrar novas palavras.

Atualização: solução sem extensões GNU

sed -n 's/\(^\|\(.* \)\)\([^ ]*\) YOUR_WORD\(\( .*\)\|$\)//; tprint; b; :print; p; q

A explicação é a mesma diferença entre barras invertidas e t . t funciona como T , mas pula se a substituição foi bem-sucedida. Se for assim, nós pulamos para "print and quit", se não - b envia para e do script e processamento da próxima linha.

    
por 05.01.2017 / 13:31