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.

È stato utile?

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top