Como pesquisar muitos arquivos com expressões regulares e resultados de saída para linhas em um novo arquivo?

2

Eu tenho milhares de arquivos de origem e gostaria de encontrar todo o texto que corresponda a uma expressão regular e, em seguida, imprima cada correspondência em sua própria linha em um arquivo de texto resultante.

Por exemplo:

// a.cs
string test = _.Text("Hello World!") + _.Text("Foo");
// b.cs
Debug.Log(_.ActionText("Bar"));

// results.txt
_.Text("Hello World")
_.Text("Foo")
_.ActionText("Bar")

Qual comando seria capaz de alcançar isso? você poderia por favor mostrar um exemplo?

    
por Lea Hayes 03.02.2015 / 15:11

2 respostas

3
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.

    
por 03.02.2015 / 15:47
0

Você pode usar o grep.

grep -Eo '_\.\w+\("[^"]+"\)'
    
por 03.02.2015 / 20:53