/ / Comment créer une commande VIM ou Vi pour supprimer tout le texte après un certain caractère pour chaque ligne d'un fichier texte? - regex, vim, vi, remplacer

Comment créer une commande VIM ou Vi pour supprimer tout le texte après un certain caractère pour chaque ligne d'un fichier texte? - regex, vim, vi, remplacer

Scénario:

  • J'ai un fichier texte qui a pipe (comme dans le | caractère) données délimitées.
  • Chaque champ de données dans les champs délimités par des canaux peut être de longueur variable, donc le comptage des caractères ne fonctionnera pas (ou en utilisant une sorte de fonction de sous-chaîne ... si celle-ci existe même dans Vim).

Est-il possible d'utiliser Vim / Vi pour supprimer toutes les donnéesdu deuxième tuyau à la fin de la ligne pour tout le fichier? Il y a environ 150 000 lignes, donc le faire manuellement ne conviendrait pas à un masochiste ...

par exemple.

Changer les lignes suivantes de:

1111|random sized text 12345|more random data la la la|1111|abcde
2222|random sized text abcdefghijk|la la la la|2222|defgh
3333|random sized text|more random data|33333|ijklmnop

à:

1111|random sized text 12345
2222|random sized text abcdefghijk
3333|random sized text

Je suis sûr que cela peut être fait d’une manière ou d’une autre… j’espère.

TIA

UPDATE: J'aurais dû mentionner que je l’utilise sous Windows XP; je n’ai donc pas accès à certaines des commandes * nix mentionnées (CUT n’est pas reconnu sous Windows).

Réponses:

30 pour la réponse № 1
:%s/^v([^|]+|[^|]+)|.*$/1/

18 pour la réponse № 2

Vous pouvez également enregistrer une macro:

qq02f | Djq

vous pourrez ensuite jouer avec 100 @ q pour exécuter la macro sur les 100 prochaines lignes.

Explication macro:

  • qq - commence l'enregistrement macro
  • 0 - aller au premier caractère de la ligne
  • 2f | - trouver la deuxième occurrence de la | personnage sur la ligne
  • - supprimer le texte après la position actuelle jusqu'à la fin de la ligne
  • j - aller à la ligne suivante
  • q - termine l'enregistrement de la macro

8 pour la réponse № 3

Si vous ne devez pas utiliser vim, une autre alternative serait la commande unix "cut".

cut -d "|" -f 1-2 file > out.file

4 pour la réponse № 4

Juste une autre manière vim de faire la même chose:

%s/^(.{-}|){2}zs.*//
%s/^(.{-}zs|){2}.*// " if you want to remove the 2nd pipe as well

Cette fois, l’expression rationnelle correspond au moins de caractères ({-}) que possible suivis d’un tuyau et deux fois ({2}), ils sont ignorés (zs) pour remplacer tous les suivants (zs) texte par rien.


3 pour la réponse № 5

Au lieu de la substitution, on peut utiliser le :normal commande pour répéter une séquence de deux commandes du mode Normal passant à la seconde | caractère et suppression tout le reste jusqu'à la fin de la ligne.

:%norm!2f|D

2 pour la réponse № 6

Utilisez: commande pour créer une commande utilisateur que vous pouvez facilement exécuter.

:command -range=% YourNameHere <line1>,<line2>s/^v([^|]+|[^|]+)|.*$/1/

1 pour la réponse № 7

Vous pouvez aussi faire:

:%s/^([^|]+|[^|]+)|.*$/1/g

1 pour la réponse № 8

utiliser awk.

awk -F"|" "{$0=$1"|"$2}1" file

0 pour la réponse № 9

J'ai constaté que vim n'était pas très doué pour la gestion de très gros fichiers. Je ne suis pas sûr de la taille de votre fichier. Peut-être que chat et sed ensemble fonctionneraient mieux.


0 pour la réponse № 10

Voici une solution sed:

sed -e "s/^([^|]*|[^|]*).*$/1/"

0 pour la réponse № 11

Cela filtrera toutes les lignes du tampon (1, $) jusqu'à ce que couper soit effectué.

:1,$!cut -d "|" -f 1-2

Essayer avec

:.!cut -d "|" -f 1-2

Pour le faire uniquement sur la ligne en cours.


0 pour la réponse № 12

Pourquoi utiliser vim?

Pourquoi ne pas simplement faire

cat my_pipe_file | cut -d"|" -f1-2