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

У меня есть json файл, куда я должен удалить последние наклонные черты вправо только. Посмотрите пример:

{"url":"http://example.com/vary/file/","originalUrl":"http://example.com/vary/file/","applications":[{.........}]}

Я просто хочу, чтобы данные были похожи:

{"url":"example.com/vary/file","originalUrl":"example.com/vary/file","applications":[{.........}]}

Как я могу сделать это с sed?

3
задан 8 February 2017 в 08:35

4 ответа

Я брал на себя смелость для изменения входа OP немного, потому что как есть, это правильно не структурировано json данные (из-за {...} часть) и реализованный маленький сценарий Python, который работает с несколькими словарями, предполагая, что мы имеем дело со словарем на строку. Кроме того, как был обсужден в комментариях к вопросу, OP также хотел удалить http:// часть.

Сценарий ниже реализует все обсужденное выше.

#!/usr/bin/env python
import json,sys

with open(sys.argv[1]) as f: 
    for line in f:
        data=json.loads(line)
        if data["url"][-1] == '/':
            data["url"]=data["url"][:-1].replace('http://','')
        if data["originalUrl"][-1] == '/':
            data["originalUrl"]=data["originalUrl"][:-1].replace('http://','')
        json.dump(data,sys.stdout)
        print("")

Тестовый прогон:

$ cat input.txt                                                                                 
{"url":"http://example.com/vary/file/","originalUrl":"http://example.com/vary/file/","applications":[{"somedata": "blah"}]}
{"url":"http://another-example.com/vary/file/","originalUrl":"http://example.com/vary/file/","applications":[{"somedata": "blah"}]}
$ ./remove_slash.py input.txt                                                                   
{"url": "example.com/vary/file", "applications": [{"somedata": "blah"}], "originalUrl": "example.com/vary/file"}
{"url": "another-example.com/vary/file", "applications": [{"somedata": "blah"}], "originalUrl": "example.com/vary/file"}
6
ответ дан 1 December 2019 в 12:56

Если Вы настаиваете на том, чтобы использовать sed, Вы могли просто соответствовать /" комбинация, для удаления последнего / в каждом поле принимая это не произойдет где-нибудь, что Вы хотите сохранить его (который должен быть довольно надежным в этом случае),

$ sed 's|/"|"|g' file
{"url":"http://example.com/vary/file","originalUrl":"http://example.com/vary/file","applications":[{.........}]}

Я использовал | разграничить вместо / сохранить обратную косую черту. Вам нужно g для нескольких соответствий на той же строке.

Вот способ вынуть http:// также в том же вызове:

$ sed -r 's|"http://([^"]+)/"|"\1"|g' url
{"url":"example.com/vary/file","originalUrl":"example.com/vary/file","applications":[{.........}]}

([^"]+) будет соответствовать чему-либо между "http:// и /" это не a ". Мы сохраняем эту часть с () и ссылка с \1.

6
ответ дан 1 December 2019 в 12:56

Последний:

простая, чисто основанная на тексте опция Python:

#!/usr/bin/env python3
import sys

with open(sys.argv[1]) as data:
    for l in data:
        print(("").join(l.strip().replace("http://", "").rsplit("/", 1)))

Или, только для забавы, другой способ сказать это:

#!/usr/bin/env python3
import sys

[print(("").join(l.strip().replace("http://", "").rsplit("/", 1))) for l in open(sys.argv[1])]

выполнение обоих строковая замена/удаление (http://) и удаление наклонной черты в appr. 47 секунд на 14 000 000 миллионах строк, в моей древней системе.

Использовать:

python3 /path/to/script.py /path/to/inputfile > outputfile

Объяснение

Как обычно, Python довольно читаем, но подробно:

  • rsplit("/", 1) разделяет строку справа (следовательно r) разделителем / только однажды (следовательно 1)
  • l.replace("http://", "") замены http:// пустой строкой
  • ("").join() присоединяется к списку, который был создан rsplit() снова в строку
5
ответ дан 1 December 2019 в 12:56

Введите файл JSON (test.json):

{"url":"http://example.com/vary/file/","originalUrl":"http://example.com/vary/file/"}
  • Код для изменения в соответствии с требованиями и повторной записи в тот же файл:

    импортируйте json
    с open("test.json") как fh:
    данные = json.load(fh)
    
    для k,v в data.items():
    data[k] = v.replace("http://","").strip("/")
    
    с open("test.json","w") как fh:
    json.dump(данные,fh)
    

Вывод:

{"url": "example.com/vary/file", "originalUrl": "example.com/vary/file"}

Все операции одновременно, заменяет http:// на "" и удаляет / в конце строки.

replace("http://","").strip("/")
0
ответ дан 5 July 2020 в 22:02

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

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