Se você trabalha muito com arquivos de texto, vai adorar o awk .
awk -i inplace 'NR==1 && match($0, /.*\('\''(.+)'\''\)/,matches) {name = matches[1]; print $0} /IGNORE/ {print $0} NR>1 && !/IGNORE/ {print gensub (/([\w ]*\('\'').+('\''\))/, "\1"name"\2", "1")}' *.txt
A explicação vai demorar um pouco, deixe-me primeiro dividir o comando em três seções, cada uma composta de uma condição e um comando:
-
NR==1 && match($0, /.*\('\''(.+)'\''\)/,matches) {name = matches[1]; print $0} isto imprime a primeira linha e copia o que no seu caso é o nome do conjunto para uma variável simplesmente chamada name .
-
/IGNORE/ {print $0} se as linhas corresponderem ao texto IGNORE , basta imprimi-las.
-
NR>1 && !/IGNORE/ {print gensub (/([\w ]*\('\'').+('\''\))/, "\1"name"\2", "1")} executa a regex e substitui as linhas restantes, empregando a variável name criada anteriormente.
Mais alguns detalhes a seguir:
awk esta é uma ferramenta para manipular arquivos de texto; alternativamente, eu recomendaria perl .
-i inplace significa que os arquivos originais serão editados (faça backups!). Aviso de isenção de responsabilidade: Eu não consegui testar essa configuração ainda porque ela requer uma versão awk mais recente do que a que eu instalei.
' o comando é uma string, portanto é encapsulado em apóstrofos.
NR==1 esta é uma condição, o número da linha deve ser 1 .
&& , isso significa AND.
match( esta é outra condição que deve ser satisfeita: uma função de correspondência regexp que leva 3 argumentos.
$0 primeiro argumento: isso representa a linha inteira.
/.*\('\''(.+)'\''\)/ second argumento, a expressão regular
matches terceiro argumento, a variável onde as sequências correspondentes devem ser armazenadas.
{ here inicia as ações que devem ser executadas caso as condições sejam verdadeiras.
name = matches[1] a variável name é criada e é designada para ser igual ao primeiro grupo de captura (o mesmo que backreference ).
; o ponto-e-vírgula separa as instruções.
print $0 também imprimimos a primeira linha.
/IGNORE/ procura linhas que contenham o texto IGNORE .
{print $0} apenas imprima-os.
NR>1 && !/IGNORE/ condition: para todas as linhas, exceto a primeira, se elas não contiverem o texto IGNORE .
{print imprime o resultado da substituição.
gensub ( function que realiza pesquisa e substituição permitindo o uso de backreferences.
/([\w ]*\('\'').+('\''\))/ do padrão de pesquisa. Aqui a seqüência '\'' é o que é necessário para inserir um único ' .
"\1"name"\2" o padrão de substituição. "" e "" são duas referências anteriores.
"1" significa que apenas a primeira correspondência deve ser substituída.
' end do comando awk .
*.txt run awk em todos os arquivos com extensão .txt no diretório atual.
Observação: sei que você está perguntando como fazer isso no Notepad ++, mas acredito que deva considerar as ferramentas de linha de comando. A razão é que os programas gráficos são mais aptos a executar uma operação única, mas no comentário que você especifica, você gostaria de automatizar o trabalho e processar 47 arquivos de uma só vez. A linha de comando é mais apta à automação do que às interfaces gráficas, esse é o meu ponto.
Para começar, você tem gawk (GNU awk) para Windows e, se quiser continuar, pode trabalhar no Linux ou instalar um ambiente semelhante ao Linux, como o Cygwin .