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

Я пытаюсь удалить определенный текст из файла. Я попытался использовать 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 и все, прежде чем это должно будет быть заменено {.

Как я могу достигнуть его?

0
задан 8 February 2017 в 14:06

5 ответов

Вы не получали то, что Вы ожидали, потому что регулярные выражения являются жадными. Соответствуйте чему-либо кроме запятой [^,] вместо любого символа:

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

Начиная с Вашего редактирования, хотя, по-видимому, нет ничего последовательного для соответствия на всех строках кроме original явно, таким образом, мы должны будем сделать это... не много забавы.

sed 's/.*,"original/{"original/'
5
ответ дан 7 November 2019 в 00:38

Другой:

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

Редактирование: флаг Use -i, если Вы хотите внести изменения в некоторый файл. Как:

sed -i.bak 'regex_above' filename

Помещение точки на -i параметр создает резервное копирование, названное filename.bak в том же dir также.

2
ответ дан 7 November 2019 в 00:38

Другая опция является поиском весь шаблон, и повторите часть, которой Вы интересуетесь. с (....) Вами может использовать содержание между () и после, в полевом использовании замены \и количество содержания.

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

sed 's/^{\(.*\),\(.*\),/{\2/' sedtest
0
ответ дан 7 November 2019 в 00:38

Можно также включать "исходный" тег:

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

Вывод:

{"original":"ex.com","tech":"c"}
{"original":"ex1.com","tech":"d"}
0
ответ дан 7 November 2019 в 00:38

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

Используя Python json модуль, нам можно было показать маленький сценарий ниже, где у Вас есть список объектов, Вы хотите сохранить. Принятие Вашего входного файла структурировано с одним 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
ответ дан 7 November 2019 в 00:38

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

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