it-swarm.com.de

Wie entferne ich nur den letzten Schrägstrich im Feld?

Ich habe eine JSON-Datei, in der ich nur die letzten Schrägstriche entfernen muss. Siehe das Beispiel:

{"url":"http://example.com/vary/file/","originalUrl":"http://example.com/vary/file/","applications":[{.........}]}

Ich möchte nur, dass die Daten so aussehen:

{"url":"example.com/vary/file","originalUrl":"example.com/vary/file","applications":[{.........}]}

Wie kann ich das mit sed machen?

3
Jaffer Wilson

Ich habe mir die Freiheit genommen, die Eingabe von OP geringfügig zu ändern, da die vorhandenen json -Daten (aufgrund des Teils {...}) nicht richtig strukturiert sind, und ein kleines python -Skript implementiert, das funktioniert mit mehreren Wörterbüchern, vorausgesetzt, wir haben es mit einem Wörterbuch pro Zeile zu tun. Wie bereits in den Kommentaren zur Frage erwähnt, wollte OP außerdem den Teil http:// entfernen.

Das folgende Skript implementiert alles, was oben diskutiert wurde.

#!/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("")

Testlauf:

$ 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"}
6

Wenn Sie auf der Verwendung von sed bestehen, können Sie einfach die /" -Kombination verwenden, um den letzten / in jedem Feld zu entfernen, vorausgesetzt, dass er nicht an einer Stelle auftritt, an der Sie ihn behalten möchten (was sollte) in diesem Fall ziemlich zuverlässig sein)

$ sed 's|/"|"|g' file
{"url":"http://example.com/vary/file","originalUrl":"http://example.com/vary/file","applications":[{.........}]}

Ich habe | anstelle von / verwendet, um einen Backslash zu speichern. Sie benötigen g für mehrere Übereinstimmungen in derselben Zeile.

Hier ist eine Möglichkeit, den http:// im selben Aufruf ebenfalls zu entfernen:

$ sed -r 's|"http://([^"]+)/"|"\1"|g' url
{"url":"example.com/vary/file","originalUrl":"example.com/vary/file","applications":[{.........}]}

([^"]+) passt auf alles zwischen "http:// und /", das kein " ist. Wir speichern diesen Teil mit () und verweisen auf \1.

6
Zanna

Ein Später:

eine einfache, rein textbasierte python Option:

#!/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)))

Oder, nur zum Spaß, eine andere Art, es auszudrücken:

#!/usr/bin/env python3
import sys

[print(("").join(l.strip().replace("http://", "").rsplit("/", 1))) for l in open(sys.argv[1])]

ersetzen/Entfernen der Zeichenfolge (http://) und Entfernen des Schrägstrichs in ca. 47 Sekunden auf 14.000.000.000 Zeilen in meinem alten System.

Benutzen:

python3 /path/to/script.py /path/to/inputfile > outputfile

Erläuterung

Wie üblich ist python gut lesbar, aber im Detail:

  • rsplit("/", 1) teilt die Zeile von rechts (daher das r) durch das Trennzeichen /nur einmal (daher das 1)
  • l.replace("http://", "") ersetzt http:// durch eine leere Zeichenfolge
  • ("").join() fügt die von rsplit() erstellte Liste erneut in eine Zeile ein
5
Jacob Vlijm