2017-09-18 2 views
3

Ich möchte jede Zeile durch die Datetime-Zeichenfolge in jedem ersetzen.Vim Regex nur Datetime ersetzen

Eingang

D­¬ng ThÞ Anh 19/02/1992 TH12B 10.0 5.0 
La C«ng TuÊn Anh 30/01/1995 TH12A 8.5 6.5 
NguyÔn §øc Anh 14/10/1995 TH12B 10.0 5.5 
Ph1m Tïng Anh 10/04/1994 HTTT11 1.0 4.5 

Ausgabe

19/02/1995 
30/06/1995 
14/11/1995 
10/03/1994 

ich mit dem folgenden Befehl versucht:

:'<,'>s/[^=\d{2}\/\d{2}\/\d{4}]/ /g 

Aber es gibt etwas falsch.

Was muss ich ändern, damit der Befehl funktioniert?

+0

Nicht schick, aber das würde funktionieren% s/\ v. {-} (\ d + \/\ d + \/\ d +). * $/\ 1'. –

+1

Um viele Backslashes zu vermeiden, können wir ein anderes Trennzeichen verwenden ':% s, \ v. {-} (\ d +/\ d +/\ d +). * $, \ 1' – SergioAraujo

Antwort

0

Suchen Sie einfach nach

\d{2}/\d{2}/\d{4} 

und die Linien ersetzen. Siehe a demo on regex101.com.

+1

Ich möchte die behalten datetime Zeichenfolgen. Wenn Sie Ihrer Regex folgen, werden die Datetime-Strings ersetzt. Liege ich falsch? –

2

Sie können den regulären Ausdruck nicht einfach "negieren"; In einigen Fällen kann ein invertiertes Muster geschrieben werden, aber dies ist keine allgemeine Lösung.

Stattdessen haben Sie Spiel die gesamte Linie und Erfassung der Text gehalten werden. Im Ersatzteil von :substitute, beziehen Sie sich nur auf die erfasste Gruppe (\1). Dies ist ein gemeinsames Muster:

%s#.*\<\(\d\+/\d\+/\d\+\)\>.*#\1# 

Anmerkung: Ich # delimiters hier verwendet haben die entweichenden des / auftretenden im Muster zu vermeiden.