我有一个 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
我冒昧地对 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"}
答案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
。
答案3
迟来的:
一个简单的、纯基于文本的 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://
在我的古老系统上,大约需要 47 秒才能完成 14,000,000 万行字符串的替换/删除( )和斜线删除。
使用方法:
python3 /path/to/script.py /path/to/inputfile > outputfile
解释
像往常一样,python 的可读性很强,但详细地说:
rsplit("/", 1)
分割线从右边(因此r
)由分隔符/
只有一次(因此1
)l.replace("http://", "")
替换http://
为空字符串("").join()
加入由 again 创建的列表,rsplit()
排成一行
答案4
输入 JSON 文件(test.json):
{"url":"http://example.com/vary/file/","originalUrl":"http://example.com/vary/file/"}
根据要求修改代码并重写到同一文件:
import json with open("test.json") as fh: data = json.load(fh) for k,v in data.items(): data[k] = v.replace("http://","").strip("/") with open("test.json","w") as fh: json.dump(data,fh)
输出:
{"url": "example.com/vary/file", "originalUrl": "example.com/vary/file"}
一次完成所有操作,用 替换http://
并在字符串末尾""
删除。/
replace("http://","").strip("/")