如何仅删除字段中的最后一个斜杠?

如何仅删除字段中的最后一个斜杠?

我有一个 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("/")

相关内容