Eu quero remover uma linha de um caractere até que outro personagem corresponda

1

Eu tenho um arquivo com o conteúdo da seguinte forma:

some other content in this file
    demo({
     'item1': { 'buy': 'bananna', 'drink': x'cooldrink',
                'work': 'hard', 
                'study': 'science' },
     'item2': { 'buy': 'apple', 'drink': x'cola',
                'work': 'slow', 
                'eat': 'sweet',
                'travel': 'world' },
     'item3': { 'buy': 'bananna', 
                'drink': x'cooldrink',
                'work': 'hard', 
                'study': 'science'}})
Some other content in this file.

Agora, quero pesquisar por item2 e remover o seguinte conteúdo:

'item2': { 'buy': 'apple', 'drink': x'cola',
                'work': 'slow', 
                'eat': 'sweet',
                'travel': 'world' },

Atualmente, estou fazendo como awk '!/'item2'/' filename . Mas, isso só excluirá essa linha específica e não até o colchete fechado com vírgula. Eu também tentei usar pcregrep -Mo 'item2' filename . Mas não consigo definir até { e até }, .

Além disso, observe que há um caso especial em que, se eu tiver de remover item3 , no final, não haverá vírgula , .

Por favor, sugira sobre o que precisa ser feito?

    
por Kasino 07.09.2016 / 14:24

1 resposta

2
$ perl -0777 -pe '$s="item1"; s/ *\x27$s\x27:\s*\{.*?\},\n*//s ; s/,\s*\x27$s\x27:\s*\{.*?\}(?!,)//s' ip.txt 
some other content in this file
    demo({
     'item2': { 'buy': 'apple', 'drink': x'cola',
                'work': 'slow', 
                'eat': 'sweet',
                'travel': 'world' },
     'item3': { 'buy': 'bananna', 
                'drink': x'cooldrink',
                'work': 'hard', 
                'study': 'science'}})
Some other content in this file.

$ perl -0777 -pe '$s="item3"; s/ *\x27$s\x27:\s*\{.*?\},\n*//s ; s/,\s*\x27$s\x27:\s*\{.*?\}(?!,)//s' ip.txt 
some other content in this file
    demo({
     'item1': { 'buy': 'bananna', 'drink': x'cooldrink',
                'work': 'hard', 
                'study': 'science' },
     'item2': { 'buy': 'apple', 'drink': x'cola',
                'work': 'slow', 
                'eat': 'sweet',
                'travel': 'world' }})
Some other content in this file.

$ perl -0777 -pe '$s="item2"; s/ *\x27$s\x27:\s*\{.*?\},\n*//s ; s/,\s*\x27$s\x27:\s*\{.*?\}(?!,)//s' ip.txt 
some other content in this file
    demo({
     'item1': { 'buy': 'bananna', 'drink': x'cooldrink',
                'work': 'hard', 
                'study': 'science' },
     'item3': { 'buy': 'bananna', 
                'drink': x'cooldrink',
                'work': 'hard', 
                'study': 'science'}})
Some other content in this file.
  • Usa -0777 para fazer slurp de todo o arquivo e s sinalizador para permitir que .* corresponda às linhas
  • s/ *\x27$s\x27:\s*\{.*?\},\n*//s para elementos como item1 e item2 , em que , segue }
  • s/,\s*\x27$s\x27:\s*\{.*?\}(?!,)//s para elementos como item3 onde suspeito que você precise remover um , na linha anterior
  • \x27 código hexadecimal para aspas simples
  • altere apenas $s="item2"; para o elemento obrigatório a ser removido


Editar:

Para passar variáveis do shell (consulte este Q & A em SO para detalhes)

$ export var1='item3'
$ perl -0777 -pe '$s=$ENV{var1}; s/ *\x27$s\x27:\s*\{.*?\},\n*//s ; s/,\s*\x27$s\x27:\s*\{.*?\}(?!,)//s' ip.txt 
some other content in this file
    demo({
     'item1': { 'buy': 'bananna', 'drink': x'cooldrink',
                'work': 'hard', 
                'study': 'science' },
     'item2': { 'buy': 'apple', 'drink': x'cola',
                'work': 'slow', 
                'eat': 'sweet',
                'travel': 'world' }})
Some other content in this file.

Você também pode excluir vários itens

$ export var1='(item3|item2)'
$ perl -0777 -pe '$s=$ENV{var1}; s/ *\x27$s\x27:\s*\{.*?\},\n*//s ; s/,\s*\x27$s\x27:\s*\{.*?\}(?!,)//s' ip.txt 
some other content in this file
    demo({
     'item1': { 'buy': 'bananna', 'drink': x'cooldrink',
                'work': 'hard', 
                'study': 'science' }})
Some other content in this file.
    
por 07.09.2016 / 15:25