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

У меня есть 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?

1
задан 8 February 2017 в 09:35

2 ответа

Если вы настаиваете на использовании 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:// и /", который не является ". Мы сохраняем эту часть с () и ссылкой с \1.

6
ответ дан 23 May 2018 в 01:42

Поздняя:

простая, чисто текстовая опция 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)))

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

[ f2]

выполняет как замену / удаление строки (http://), так и удаление косой черты в ок. 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
ответ дан 23 May 2018 в 01:42

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

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