Holen Sie sich Inhalte vor einem Doppelpunkt


8

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?


2
Das grepDienstprogramm 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. das cutDienstprogramm.
Kusalananda

Ich habe eine Bearbeitung eingereicht, um das Wort "grep" herauszunehmen und es im Titel durch "find" und im Fragetext durch "get" zu ersetzen, um das X / Y-Problem zu vermeiden, dass davon ausgegangen grepwird, dass es das richtige Werkzeug ist, um das eigentliche Problem zu lösen Problem.
Monty Harder

1
Ich kann nur sagen, dass der Inhalt vor dem Doppelpunkt viel besser ist als der Inhalt nach dem Doppelpunkt ;-).
Peter - Monica

Antworten:


35

Dafür ist da cut:

$ cat file
help.helloworld.com:latest.world.com
dev.helloworld.com:latest.world.com
foo:baz:bar
foo

$ cut -d: -f1 file
help.helloworld.com
dev.helloworld.com
foo
foo

Sie setzen einfach das Trennzeichen auf :mit -d:und weisen es an, nur das 1. Feld ( -f1) zu drucken .


19

Oder eine Alternative:

$ grep -o '^[^:]*' file
help.helloworld.com
dev.helloworld.com

Dies gibt alle Zeichen zurück, die am Anfang jeder Zeile ( ^) beginnen und keine Doppelpunkte ( [^:]*) sind.


18

Würde auf jeden Fall empfehlen awk:

awk -F ':' '{print $1}' file

Wird :als Feldtrennzeichen verwendet und druckt das erste Feld.


5

aktualisierte Antwort

Betrachtet man die folgende Datei file.txt:

help.helloworld.com:latest.world.com
dev.helloworld.com:latest.world.com
no.colon.com
colon.at.the.end.com:

Sie können verwenden sed, um alles nach dem Doppelpunkt zu entfernen:

sed -e 's/:.*//' file.txt

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.


4
sed -e 's/:.*//' file.txtist ein anderer Weg mit Posix sed.
Rakesh Sharma

1
sed -ne 'y/:/\n/;P' file.txtkann auch verwendet werden.
Rakesh Sharma

Machen Sie .+zu.*
Rakesh Sharma

@Randy Joselyn Da ifdie s///pSyntax implizit ist , müssen Sie Ihren regulären Ausdruck ändern, um Zeilen ohne Doppelpunkte zu behandeln sed -nEe 's/([^:]*)(:.*|)/\1/p'. Beachten Sie, dass dies erforderlich ist, GNU sedaber da Sie ohnehin auf GNU sed sind, sollte dies keine Rolle spielen.
Rakesh Sharma

Diese Antwort hätte mein Favorit sein können, aber die ERE sind unnötig. sed -n '/:/s/^\([^:]*\):.*$/\1/p( --posix
Fügen

4

Benötigt GNU grep. Es würde nicht mit dem Standard-Grep unter z. B. MacOS oder einem der anderen BSDs funktionieren.

Meinst du so:

grep -oP '.*(?=:)' file

Ausgabe:

help.helloworld.com
dev.helloworld.com

4
Wenn sich zwei oder mehr Doppelpunkte in der Zeile befinden, wird alles bis zum letzten gedruckt, also nicht das, was das OP benötigt. Versuchen Sie es 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.
Terdon

Es gibt nur einen Doppelpunkt und es funktioniert gut, aber danke für das Update
Gabrial Johnas

-1

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:

for line in $(cat inputfile); do echo "${line%%:*}"; done

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).



Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.