como remover um string / bloco multilinha de padrão de texto de um arquivo? [duplicado]

2

Eu tenho um arquivo de texto que tem uma seqüência de texto com múltiplas linhas de texto e eu gostaria de verificar o arquivo e remover todas as instâncias que ele encontra dessa sequência multilinha e, às vezes, duplicada.

string de exemplo:

recursive-test yes;
test-limit{
tests 10;
};
location "testLoc" {
type test;
};
location "testLoc2"{
type test;
file "/etc/var/test.sql";
};
include "/etc/var/test.conf";
};



recursive-test yes;
test-limit{
tests 10;
};
location "testLoc" {
type test;
};
location "testLoc2"{
type test;
file "/etc/var/test.sql";
};
include "/etc/var/test.conf";
};

otherTestTextHere
123
321

recursive-test yes;
test-limit{
tests 10;
};
location "testLoc" {
type test;
};
location "testLoc2"{
type test;
file "/etc/var/test.sql";
};
include "/etc/var/test.conf";
};

Como você pode ver, a sequência repetitiva de texto no arquivo de texto é sempre a mesma, desde o início da sequência até o final das várias linhas, é sempre a mesma:

recursive-test yes;
test-limit{
tests 10;
};
location "testLoc" {
type test;
};
location "testLoc2"{
type test;
file "/etc/var/test.sql";
};
include "/etc/var/test.conf";
};

A string multilineada não deve ser duplicada normalmente, mas como um método de falha de segurança também estou procurando um método que varre apenas todas as instâncias e remova-a completamente se por algum motivo a string for duplicada de outro aplicativo que está gravando o arquivo de texto.

Usando sed , só consigo descobrir como excluir uma linha por vez, mas isso não funciona para mim, pois algumas vezes algumas das palavras em algumas das linhas da string multilinha aparecem em outras cadeias de caracteres multilineadas são semelhantes, mas eu quero manter. Eu estou realmente apenas tentando pesquisar duplicatas 'exatas' dessa string multilinha do início ao fim da string.

Estou tentando mantê-lo em uma linha de comando / otimizada.

    
por RCG 25.02.2015 / 06:11

2 respostas

3

Como eu entendi o OP, existem alguns blocos de texto separados por linhas vazias e o OP deseja remover todas as duplicatas:

awk -v RS='\n\n' -v ORS="\n\n" '!seen[$0]++' file

Se o OP quiser apenas remover o bloco, tente-o através do GNU sed:

sed -z 's~recursive-test yes;\ntest-limit{\ntests 10;\n};\nlocation "testLoc" {\ntype test;\n};\nlocation "testLoc2"{\ntype test;\nfile "/etc/var/test.sql";\n};\ninclude "/etc/var/test.conf";\n};~~g' file
    
por 25.02.2015 / 08:01
1
< input python -c 'import sys; sys.stdout.write(sys.stdin.read().replace("""recursive-test yes;\ntest-limit{\ntests 10;\n};\nlocation "testLoc" {\ntype test;\n};\nlocation "testLoc2"{\ntype test;\nfile "/etc/var/test.sql";\n};\ninclude "/etc/var/test.conf";\n};""", ""))'

As aspas triplas do python ( """ ) ajudam muito a não ter que escapar das aspas na string para corresponder.

    
por 25.02.2015 / 08:01