Como apagar até uma parte específica de uma linha?

0

Estou tentando remover o texto específico do arquivo. Eu tentei usar sed :

sed 's/.*,/{/' beta.txt | head -n5

Mas não obteve o resultado esperado.
Aqui está a entrada e a saída que recebi:

{"url":"example.com","original":"ex.com","tech":"c"}
{"url":"example1.com", jkdshsjkfhdj,"dsd":"sdsd","original":"ex1.com","tech":"d"}

A saída que recebi é:

{"tech":"c"}
{"tech":"d"}

O que eu espero é:

{"original":"ex.com","tech":"c"}
{"original":"ex1.com","tech":"d"}

Eu só quero ter original e tudo antes de ser substituído por { .

Como posso conseguir isso?

    
por Jaffer Wilson 08.02.2017 / 12:48

5 respostas

5

Você não estava recebendo o que esperava, porque expressões regulares são gananciosas. Corresponder qualquer coisa, exceto uma vírgula [^,] em vez de qualquer caractere:

$ sed 's/[^,]*,/{/' beta.txt
{"original":"ex.com","tech":"c"}
{"original":"ex1.com","tech":"d"}

Desde a sua edição, aparentemente não há nada consistente para combinar em todas as linhas, exceto original explicitamente, então teremos que fazer isso ... não é muito divertido.

sed 's/.*,"original/{"original/'
    
por Zanna 08.02.2017 / 12:58
2

Outro:

# sed 's/\".*com,//' sedtest
{"original":"ex.com","tech":"c"}
{"original":"ex1.com","tech":"d"}

Editar: Use -i flag se você quiser fazer alterações em algum arquivo. Como:

sed -i.bak 'regex_above' filename

Colocar um ponto no parâmetro -i cria um backup chamado filename.bak no mesmo diretório também.

    
por fugitive 08.02.2017 / 13:03
1

A pergunta apropriada a fazer aqui seria "Como manter apenas itens específicos no dicionário json ", porque é exatamente isso que é visto nos seus exemplos. É claro que é possível fazê-lo através de outras ferramentas de processamento de texto, mas se estivermos trabalhando com json , então vamos usar ferramentas adequadas para isso.

Usando o módulo json do python, podemos ter o pequeno script mostrado abaixo, onde você tem uma lista de itens que deseja manter. Assumindo que seu arquivo de entrada é estruturado com um dicionário json por linha, podemos ler o arquivo linha por linha e carregar cada linha como dicionário do python. De lá, é o caminho direto para a vitória - repita todas as chaves do dicionário e veja se elas estão na lista de itens que queremos manter; se eles não estiverem nessa lista, mostre-os.

#!/usr/bin/env python
import json,sys
keep = ['tech','original']
with open(sys.argv[1]) as f:
    for line in f:
        data=json.loads(line)
        for key in data.keys():
           if key not in keep: 
               data.pop(key)
        json.dump(data,sys.stdout)
        print ""

Execução de teste:

$ cat input.json                                                                                      
{"url":"example.com","original":"ex.com","tech":"c"}
{"url":"example1.com","dsd":"sdsd","original":"ex1.com","tech":"d"}
$ ./remove_json_items.py input.json                                                                   
{"tech": "c", "original": "ex.com"}
{"tech": "d", "original": "ex1.com"}
    
por Sergiy Kolodyazhnyy 08.02.2017 / 23:14
0

Outra opção é pesquisar todo o padrão e repetir a parte em que você está interessado. com (....) você pode usar o conteúdo entre () e depois, no campo de substituição use \ e o número de conteúdo.

Neste exemplo, eu fiz dois textos e o primeiro \ 1 o segundo \ 2, então você está interessado em \ 2 e sua resposta é:

sed 's/^{\(.*\),\(.*\),/{/' sedtest
    
por Mquinteiro 08.02.2017 / 13:20
0

Você também pode incluir a tag "original":

's/{.*,"original"/{"original"/' beta.txt

Saída:

{"original":"ex.com","tech":"c"}
{"original":"ex1.com","tech":"d"}
    
por arupgsh 08.02.2017 / 14:59