Rimuovere i due punti usando VI
Domanda
Sto cercando di trovare e sostituire in VI per rimuovere un timestamp. Di solito lo faccio in VI usando il comando S ma come faccio a dire a VI che devo rimuovere i due punti quando fa parte della struttura del comando VI stesso
EX: " xxxxx xxxxx 24:00:00 CDT "
provato
s: 24: 00: 00 CDT :: g
s: " 24: 00: 00 CDT " :: g
s: / ::: g
Qualsiasi aiuto è apprezzato.
Soluzione
Normalmente, vi usa il carattere che segue la lettera di comando come separatore. Prova questo:
s!24:00:00 CDT!!g
Altri suggerimenti
Il problema qui non è la corrispondenza dei due punti, ma che ti è stato insegnato che Vim DEVE usare i due punti per separare la sua regex. Questo non è corretto.
awk / vi / perl / ruby ??(e molti altri) consentono di specificare il delimitatore wahtever desiderato. Questo personaggio è quello che segue il carattere di comando (nel nostro caso una S), ad esempio:
s/hello/there/
s:hello:there:
s@hello@there@
sono tutti la stessa regex, solo con delimitatori diversi. Questa flessibilità significa che se usi spesso /, ma devi quindi abbinare un / nella regex, puoi semplicemente passare ad un altro delimitatore, ad esempio:
sMhel/loMthereM
Sebbene " M " potrebbe non essere la scelta migliore quando il regex contiene testo - dipende dal tuo stile e da ciò che stai abbinando realmente.
Puoi anche usare le parentesi. Per una singola regex è:
s[hello]
o
s(hello)
Penso che per lo stile di ricerca e sostituzione sia possibile usare s [ciao] [lì]
o eventualmente anche s [ciao] (lì)
. Ma quest'ultima frase tra parentesi è una ipotesi per metà ricordata da quando ho usato perl.
Nella mia versione di vi, posso fare quanto segue per rimuovere i due punti da una linea. YMMV.
:s/://g
s / \ d \ +: \ d \ +: \ d \ + CDT // g
funziona per me:
contenuto iniziale:
xxxxx xxxxx 24:00:00 CDT
dopo il comando:
xxxxx xxxxx
se vuoi essere sicuro che influenzerà solo i timestamp (così com'è, che regex sopra cambia qualsiasi numero di cifre > 1), usa
s/\d\d:\d\d:\d\d CDT//g
dove la g finale modifica tutte le occorrenze del pattern, non solo la prima.
Se hai più di un fuso orario nell'elenco, raggruppali:
:s/\d\+:\d\+:\d\+^Y \(CDT\|UDT\)//g
Non fa davvero parte del comando, dal momento che dovrebbe permetterti di usare qualsiasi delimitatore che ti piace.
Probabilmente proverei: -
%s/\d\{2}:\d{2}:\d{2}//g