У меня есть 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?
Если вы настаиваете на использовании 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.
Поздняя:
простая, чисто текстовая опция 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() снова в строке