Ich habe eine Textdatei unter Linux, deren Inhalt wie folgt ist:
help.helloworld.com:latest.world.com
dev.helloworld.com:latest.world.com
Ich möchte den Inhalt vor dem Doppelpunkt wie folgt erhalten:
help.helloworld.com
dev.helloworld.com
Wie kann ich das im Terminal machen?
text-processing
grep
Gabrial Johnas
quelle
quelle
grep
Dienstprogramm wird zum Suchen nach Zeilen verwendet, die mit regulären Ausdrücken übereinstimmen. Sie könnten es möglicherweise hier verwenden, aber es wäre besser, ein Tool zu verwenden, das Daten aus Feldern mit einem bestimmten Trennzeichen extrahiert, z. B. dascut
Dienstprogramm.grep
wird, dass es das richtige Werkzeug ist, um das eigentliche Problem zu lösen Problem.Antworten:
Dafür ist da
cut
:Sie setzen einfach das Trennzeichen auf
:
mit-d:
und weisen es an, nur das 1. Feld (-f1
) zu drucken .quelle
Oder eine Alternative:
Dies gibt alle Zeichen zurück, die am Anfang jeder Zeile (
^
) beginnen und keine Doppelpunkte ([^:]*
) sind.quelle
Würde auf jeden Fall empfehlen
awk
:Wird
:
als Feldtrennzeichen verwendet und druckt das erste Feld.quelle
aktualisierte Antwort
Betrachtet man die folgende Datei
file.txt
:Sie können verwenden
sed
, um alles nach dem Doppelpunkt zu entfernen:Dies funktioniert für alle Eckfälle, auf die in den Kommentaren hingewiesen wird - wenn es in einem Doppelpunkt endet oder wenn es keinen Doppelpunkt gibt, obwohl diese in der Frage selbst nicht erwähnt wurden. Vielen Dank an @Rakesh Sharma, @mirabilos und @Freddy für ihre Kommentare. Das Beantworten von Fragen ist eine gute Möglichkeit zu lernen.
quelle
sed -e 's/:.*//' file.txt
ist ein anderer Weg mit Posix sed.sed -ne 'y/:/\n/;P' file.txt
kann auch verwendet werden..+
zu.*
if
dies///p
Syntax implizit ist , müssen Sie Ihren regulären Ausdruck ändern, um Zeilen ohne Doppelpunkte zu behandelnsed -nEe 's/([^:]*)(:.*|)/\1/p'
. Beachten Sie, dass dies erforderlich ist,GNU sed
aber da Sie ohnehin auf GNU sed sind, sollte dies keine Rolle spielen.sed -n '/:/s/^\([^:]*\):.*$/\1/p
(--posix
Meinst du so:
Ausgabe:
quelle
echo foo:bar:baz | grep -oP '.*(?=:)'
. Dies funktioniert für das Beispiel des OP, jedoch nicht für den in der Frage beschriebenen allgemeinen Fall.Sie können dies mit der Behandlung von Bash-Zeichenfolgen erreichen, indem Sie die längste Übereinstimmung für jede Zeile, die wie folgt gelesen wird, direkt aus der Zeichenfolge entfernen:
Dies kann eine nützliche Alternative sein, wenn Sie die Datei in einem Shell-Skript analysieren (obwohl ich vermute, dass die Verwendung von cut effizienter ist).
quelle
In einer reinen POSIX-Shell ohne Verwendung externer Befehle würde ich Folgendes tun:
quelle