Bis zum ersten Auftreten des Dickdarms mit sed löschen

16

Mein sed Befehl ist,

 sed '/(.*:)/d' <<< 'abcd:bcde:cdeaf'

Es muss zurückkehren,

bcde:cdeaf

(dh) alle Zeichen vor dem ersten Doppelpunkt in der Zeile und dem Doppelpunkt selbst müssen entfernt werden.

Damit wird aber nichts entfernt.

Meine Verwirrung entsteht hauptsächlich durch,

1) Müssen Parens für Pattern Matching in sed regex-es maskiert werden?

2) In beiden Fällen (mit Flucht / ohne Flucht) funktioniert es nicht. Ich habe es versucht,

sed -E '/\\(.*:\\)/d' <<< 'abcd:bcde'

quelle
1
Sie möchten sed 's/[^:]*://'. dÜbrigens, Sie löschen die Eingabezeile nicht, sondern ändern sie mit einem s///Ubstitution-Befehl. Sie müssen das erste Bit ohne Doppelpunkt und den darauf folgenden Doppelpunkt durch gar nichts ersetzen.
mikeserv
Das löst innerhalb sed es ... Danke, Mann ... dies ist ein Beispiel i RegexMuster Anpassung zu erfahren hat ist ... also, für eine Antwort suche ich , dass Anwendungen Gruppe / Mustererkennung mit Pars ...
3
Oder einfach mit bash: printf "%s\n" "${line#*:}"...
jasonwryan
1
@ jasonwryan - ein guter Punkt, wenn man die Beispielquelle betrachtet. Es ist definitiv die effizientere Art, damit umzugehen. aber wenn es eine ist while read line, die das bekommt $line, sedsollte das wohl vorgezogen werden.
mikeserv

Antworten:

23
$ echo 'abcd:bcde:cdeaf' | sed 's/^[^:]*://g'
bcde:cdeaf

Der erste ^bedeutet den Beginn der Zeile. Das [^:]ist nur der einzige Weg , ich weiß , wie man schreibt nicht einen Doppelpunkt . Das *Nach-dem-Doppelpunkt bedeutet eine beliebige Anzahl der Dinge direkt vor mir (in diesem Fall das Nicht-Doppelpunkt). Schließlich :wählt der den Doppelpunkt.

Mit anderen Worten, wählen Sie den Zeilenanfang, eine beliebige Anzahl von Dingen, die kein Doppelpunkt sind, und den ersten Doppelpunkt aus.

Das //gbedeutet, dass jede übereinstimmende Instanz gelöscht wird.

user1717828
quelle
3
Sie müssen ^Ihr Match nicht verankern, es sei denn, Sie fügen auch eine gglobale Flagge hinzu. Es kann immer nur ein gerstes Vorkommen eines Musters geben, und daher entfernt das globale Flag nicht alle [^:]*:Muster aus einer Linie, wie dies der Fall wäre, wenn Sie es nicht ^verankern würden. Anstatt den regulären Ausdruck mit zwei unnötigen Flags zu komplizieren, die nur dazu dienen, sich gegenseitig aus dem Gleichgewicht zu bringen, können Sie sie einfach weglassen. Dies wurde in der bearbeiteten Version dieser Antwort demonstriert, bevor Sie sie rückgängig machten. Warum Sie darauf bestehen würden, schlechte Informationen zu verbreiten, weiß ich nicht, aber das macht dies zu einer schlechten Antwort.
mikeserv
@mikeserv, wie ich bereits sagte, danke für den Hinweis. Ich schätze es sehr, dass Sie mir dabei helfen, meine sedFähigkeiten zu verbessern . Ich bin neu in sedder sehr eingeschränkten Syntax, die ich bisher aufgegriffen habe , und fühle mich noch nicht wohl damit. Das sed(heh), ich denke, meine Antwort löst das Problem von OP, obwohl es nicht die optimale (dh Ihre) Antwort ist. Dies ist Stack Exchange, nicht Wikipedia. Korrigieren Sie mich, wenn ich falsch liege. Wenn Sie jedoch eine bessere Antwort kennen, sollten Sie sie posten, damit die Leute die verschiedenen Ansätze sehen und vergleichen können. Bitte verwandeln Sie meine Antwort nicht in Ihre Antwort mit der Bearbeitungsfunktion .
user1717828
4
Es war nicht meine Antwort. es war deine Antwort, bearbeitet. das ist alles. und es war gut . es ist nicht mehr.
mikeserv
4

Um mit Spalten zu arbeiten, gibt es cut:

echo 'abcd:bcde:cdeaf' | cut -d: -f2-

das gleiche tun

echo 'abcd:bcde:cdeaf' | cut -d: -f1 --complement

Und andere Version mit sed(schneller für Big Data):

echo 'abcd:bcde:cdeaf' | sed 's/^://;t;s/:/\n:/;D'

Und eher exotisch in bash

echo 'abcd:bcde:cdeaf' | { IFS=: read -r first last ; echo "$last" ; }

oder

echo 'abcd:bcde:cdeaf' | { read -r line ; echo ${line#*:} ; }

oder

echo 'abcd:bcde:cdeaf' | { IFS=: read -a a ; printf '%b:' "${a[@]:1}\c" ; echo ;}
Costas
quelle
Sie können auch die richtige Methode hinzufügen, um dies mit sed zu tun, das heißtsed 's/[^:]*://'
don_crissti
@don_crissti Die Version ist in der obigen Antwort vermerkt. Zusätzlich ist es aufgrund der Verwendung von Regexp langsamer, da der Ausdruck in jeder Zeile kompiliert werden muss.
Costas
Nein, ist es nicht. Die obige Antwort ist umwerfend und verdient viele Ablehnungen - insbesondere, wenn Sie die Überarbeitungen und Kommentare dort lesen.
don_crissti