У меня есть 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
?
Я брал на себя смелость для изменения входа 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"}
Если Вы настаиваете на том, чтобы использовать 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
.
Последний:
простая, чисто основанная на тексте опция 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()
снова в строкуВведите файл 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("/")