sed '/\n/P;//!s/_\.[^ ("]*Text([^)]*)/\n&\n/;D' files... >results.txt
... provavelmente funcionaria. Execute seus dados de exemplo impressos:
_.Text("Hello World!")
_.Text("Foo")
_.ActionText("Bar")
Tudo o que ele faz é incluir a primeira correspondência em uma linha em \n
ewlines. Seja ou não bem-sucedido D
elimina até o primeiro \n
ewline no espaço de padrão - que, para uma linha não correspondente, a remove completamente da saída, mas para uma correspondência é excluída apenas até a ponta de seu padrão e script começa novamente a partir do topo. Se um \n
ewline for correspondido no espaço padrão - o que só poderá acontecer se uma correspondência for encontrada e, em seguida, D
eleted -, então sed
será impresso até o primeiro \n
ewline no espaço padrão - que é na cauda da sua corda combinada. A s///
ubstitution é !
não tentada quando há um \n
ewline no espaço padrão, portanto, o comando D
elete limpa a correspondência já impressa e o ciclo inicia novamente a partir da última última partida.
Dependendo do seu sed
, talvez seja necessário usar um literal \n
ewline no lugar do n
no campo de substituição à direita. Mas você deve ser capaz de fazer todos os argumentos de arquivo de uma só vez - ou, pelo menos, muitos ao mesmo tempo (em função dos limites do ARGMAX) . Você pode apenas shell glob para aqueles, ou talvez faça ...
find /path -name pattern -exec sed script_above {} + >>results.txt
... porque sed
tratará todos os arquivos de entrada como um único fluxo.