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?

Gabrial Johnas
quelle
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 .

terdon
quelle
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.

Freddy
quelle
18

Würde auf jeden Fall empfehlen awk:

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

Wird :als Feldtrennzeichen verwendet und druckt das erste Feld.

Centimane
quelle
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.

Randy Josleyn
quelle
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
schrodigerscatcuriosity
quelle
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).

Jim Rippon
quelle