rechercher et remplacer dans VI

0

J'ai besoin de convertir '12 .22.54 'en '12: 22: 54' dans une chaîne ci-dessous pour que cela fonctionne dans MS SQL.

cast('14-JAN-14 06.65.22 AM' as datetime),'63.124.79.253');
cast('14-JAN-14 12.22.36 AM' as datetime),'63.124.79.253');
cast('14-JAN-14 22.13.54 AM' as datetime),'63.124.79.253');

J'ai essayé d'ouvrir le fichier dans vi et remplacer comme

:s/(\d\{2\})\.(\d\{2\}z)\.(\d\{2\})/$1:$2:$3/g

Mais ça ne marche pas. S'il vous plaît aider.

utilisateur1001836
la source
3
On dirait que vous avez de plus gros problèmes - ce 06.65.22n’est pas une heure valide dans n’importe quel format, et vous avez ce qui semble être 24 heures suffixées de suffixe AM. Est-ce textuellement du fichier ou l'avez-vous expurgé?
Paul
Bonjour Paul, il s’agit de la date et d’heure Oracle et j’ai besoin de la convertir en date et heure MS SQL. Si je peux convertir tous les points en points-virgules, cela fonctionne bien. Cependant, le fichier est trop volumineux, je dois donc les remplacer avec regex.
user1001836
Je pense que vous manquez mon point. Il n'y a pas de format horaire sur cette planète qui dure plus de 60 minutes par heure et lorsque vous utilisez AM / PM, vous ne pouvez pas avoir plus de 12 heures dans la colonne des heures. C'est-à-dire qu'il n'y a pas d'heure telle que 22h13 du matin.
Paul
Désolé, j'ai copié et collé, alors je viens de composer quelques chiffres. Le problème est de savoir comment convertir "." to ':' sans affecter l'adresse IP. Il s'agit de la chaîne d'origine: to_timestamp ('24 -JUL-14 04.48.47.000000000 PM ',' DD-MON-RR HH.MI.SS.FF AM '),' 63.124.79.253 ', 0);
user1001836

Réponses:

0

Pour éviter l'adresse IP, je viens de mettre des espaces autour de la chaîne correspondante:

:%s/ \(\d\d\)\.\(\d\d\)\.\(\d\d\) / \1:\2:\3 /g
Paul
la source
1

vin'utilise pas d'expressions régulières de style perl. Tu as écrit

:s/(\d\{2\})\.(\d\{2\}z)\.(\d\{2\})/$1:$2:$3/g

mais viutilise une syntaxe comme celle-ci (vim et vile accept \d, mais vous avez dit "vi" ):

:s/\([[:digit:]]\{2\}\)\.\([[:digit:]]\{2\}\)\.\([[:digit:]]\{2\}\)/\1:\2:\3/g

(D'où vient le "z"?).

Le fait est que ce que Perl appelle "obsolète" est la syntaxe POSIX pour les références arrière. Bien entendu, Perl ne sera jamais normalisé tant que Larry Wall sera présent.

Selon les commentaires, l'objectif du PO était de changer toutes les lignes. Dans vi, cela se fait en utilisant la plage spéciale %:

:%s/\([[:digit:]]\{2\}\)\.\([[:digit:]]\{2\}\)\.\([[:digit:]]\{2\}\)/\1:\2:\3/g

On pourrait aussi utiliser explicitement une plage ( $POSIX également ):

:1,$s/\([[:digit:]]\{2\}\)\.\([[:digit:]]\{2\}\)\.\([[:digit:]]\{2\}\)/\1:\2:\3/g

Il existe d'autres moyens de construire les limites pour éviter les adresses IP. Mais avec l'exemple donné, un blanc suffit:

:s/ \([[:digit:]]\{2\}\)\.\([[:digit:]]\{2\}\)\.\([[:digit:]]\{2\}\) / \1:\2:\3 /g

De même, vim et vile acceptent \sdes espaces, mais POSIX n'accepterait qu'un espace littéral (comme indiqué) ou une classe de caractères [:space:]. La plupart des gens trouvent [spacetab]moins de problèmes à taper que [[:space:]].

Comme indiqué, si vous dites "vi", d'autres peuvent choisir de répondre en fonction du comportement standard (POSIX). Certains éditeurs pouvant être utilisés à la place de "vi" fournissent des extensions à la syntaxe des expressions rationnelles. Une vérification rapide montre qu'elvis prend également en charge le style Perl \det \sque nvi (le plus conforme des quatre) ne le prend pas.

Thomas Dickey
la source
Merci beaucoup Thomas. Cela fonctionne très bien mais ligne par ligne et non globalement. J'ai ajouté \ sAM au cas où une adresse IP tombe dans le modèle suivant: s / ([[: digit:]] \ {2 \}) \. ([[: Digit:]] \ {2 \}) \. [: digit:]] \ {2 \} \ sAM) / \ 1: \ 2: \ 3 / g
user1001836
En fait, je pensais que vous aviez l’intention d’utiliser chaque ligne, et j’ai supposé que la question portait sur les références en arrière. Ajoutera "%" pour être complet.
Thomas Dickey