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 .