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.