Angenommen, ich habe eine Liste von URLs in einer Textdatei:
google.com/funny
unix.stackexchange.com/questions
isuckatunix.com/ireallydo
Ich möchte alles löschen, was nach ".com" kommt.
Erwartete Ergebnisse:
google.com
unix.stackexchange.com
isuckatunix.com
Ich habe es versucht
sed 's/.com*//' file.txt
aber es wurde auch gelöscht .com
.
text-processing
sed
Koshur
quelle
quelle
.com
nur suchen möchten, anstatt alles nach und einschließlich des ersten/
Zeichens zu entfernen ? Was wäre, wenn Sie eine URL wieen.wikipedia.org/wiki/Ubuntu
in Ihrer Liste hätten?Antworten:
Um explizit alles zu löschen, was nach ".com" kommt, müssen Sie nur Ihre vorhandene sed-Lösung optimieren, um ".com (irgendetwas)" durch ".com" zu ersetzen:
Ich habe deine Regex angepasst, um der ersten Periode zu entkommen. Andernfalls hätte es zu "thisiscommon.com/something" gepasst.
Beachten Sie, dass Sie das ".com" -Muster möglicherweise mit einem abschließenden Schrägstrich weiter verankern möchten, damit Sie nicht versehentlich etwas wie "sub.com.domain.com/foo" abschneiden:
quelle
Sie können das
awk
Feldtrennzeichen (-F
) folgendermaßen verwenden:Erläuterung:
Wenn Sie alle nachfolgenden Elemente löschen möchten
.com
,-F '.com'
trennen Sie die Zeile mit.com
undprint $1
geben Sie nur den vorherigen Teil aus.com
. Fügt also$1".com"
hinzu.com
und liefert die erwartete Ausgabe.quelle
/
als FS und das erste Feld nehmen?acomercial.com/asdsad
Das beste Tool für die nicht interaktive direkte Bearbeitung von Dateien ist
ex
.Wenn Sie
vi
einen Befehl verwendet haben und dieser mit einem Doppelpunkt beginnt, haben:
Sie einen ex-Befehl verwendet. Natürlich sind viele der fortgeschrittenen oder "ausgefallenen" Befehle, die Sie auf diese Weise ausführen können, Vim-Erweiterungen (z. B.:bufdo
) und sind nicht in den POSIX-Spezifikationen für definiertex
, aber diese Spezifikationen ermöglichen ein wirklich erstaunliches Maß an Leistung und Flexibilität in nicht visuellen Bereichen Textbearbeitung (interaktiv oder automatisiert).Der obige Befehl besteht aus mehreren Teilen.
-s
Aktiviert den unbeaufsichtigten Modus, um dieex
Stapelverwendung vorzubereiten . (Unterdrückung von Ausgabenachrichten ua)-c
Gibt den Befehl an, der ausgeführt werden soll, sobald die Datei (file.txt
in diesem Fall) in einem Puffer geöffnet wurde.%
ist ein Adressenspezifizierer, der1,$
- es bedeutet, dass der folgende Befehl auf alle Zeilen des Puffers angewendet wird.s
ist der Ersatzbefehl, mit dem Sie wahrscheinlich bereits vertraut sind. Es wird häufig invi
und mit im Wesentlichen identischen Funktionen wie ders
Befehl von verwendetsed
, obwohl einige der erweiterten regulären Funktionen je nach Implementierung variieren können. In diesem Fall wird von ".com" bis zum Ende der Zeile nur ".com" verwendet.Die vertikale Leiste trennt die auszuführenden sequentiellen Befehle. In vielen (den meisten)
ex
Implementierungen können Sie auch eine zusätzliche-c
Option verwenden, z.Dies wird jedoch von POSIX nicht benötigt.
Der
x
Befehl wird beendet, nachdem Änderungen an der Datei geschrieben wurden. Im Gegensatz zuwq
"Schreiben und Beenden" wirdx
in die Datei nur geschrieben, wenn der Puffer bearbeitet wurde. Wenn also Ihre Datei unverändert bleibt, bleibt der Zeitstempel erhalten.quelle
sed
-i. Es liest / schreibt in die Festplattenpuffer. Überzeugen Sie sich selbst mitex -r
dempreserve
Befehl.preserve
Befehl?Sehr schnelle, einfache und schmutzige Python-Methode:
Probelauf
quelle
.com
, sondern entfernt einfach alles, beginnend mit dem ersten/
in der Zeile. (Das ist meiner Meinung nach sogar der bessere Ansatz!).net
, wird in anderen Ansätzen der Teil nach der Domäne und der Erweiterung nicht gelöscht. Daher ist es sicherer, ihn/
als Trennzeichen zu verwenden.