Как удалить до определенной части строки?

Я пытаюсь удалить конкретный текст из файла. Я попытался использовать sed:

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

Но не получил ожидаемого результата. Вот вход и выход, которые я получил:

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

Полученный результат:

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

Я ожидаю:

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

Я просто хочу иметь original и все, прежде чем оно должно быть заменено на {.

Как я могу это достичь?

1
задан 9 February 2017 в 01:06

4 ответа

Еще один:

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

Изменить: используйте флаг -i, если вы хотите внести изменения в какой-либо файл. Например:

sed -i.bak 'regex_above' filename

Помещение точки в параметр -i создает резервную копию с именем Edit: в том же каталоге.

2
ответ дан 23 May 2018 в 01:40

Правильный вопрос, задаваемый здесь, будет «Как хранить только определенные элементы в словаре json», потому что это именно то, что видно на ваших примерах. Конечно, это можно сделать с помощью других инструментов обработки текста, но если мы работаем с json, тогда давайте использовать для этого подходящие инструменты.

Используя модуль json python, мы можем иметь маленький скрипт, показанный ниже, где у вас есть список предметов, которые вы хотите сохранить. Предполагая, что ваш входной файл структурирован с помощью одного словаря json в строке, мы можем читать файл по строкам и загружать каждую строку в качестве словаря python. Оттуда это прямой путь к победе - перебирайте все ключи в словаре и посмотрите, находятся ли они в списке предметов, которые мы хотим сохранить; если они не находятся в этом списке - вытащите их.

#!/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 ""

Тестирование:

$ 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"}
1
ответ дан 23 May 2018 в 01:40

Другой вариант - поиск всех patern и повторение интересующей вас части. (...) вы можете использовать контент между () и after, в поле подстановки используйте \ и количество содержимого.

В этом примере я сделал два текста и первый \ 1 второй \ 2, чтобы вы заинтересовались \ 2, и ваш ответ:

sed 's/^{\(.*\),\(.*\),/{\2/' sedtest
0
ответ дан 23 May 2018 в 01:40

Вы также можете включить тег «original»:

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

Выход:

{"original":"ex.com","tech":"c"}
{"original":"ex1.com","tech":"d"}
0
ответ дан 23 May 2018 в 01:40

Другие вопросы по тегам:

Похожие вопросы: