2009-05-07 17 views
1

Comment puis-je remplacer les dix premiers caractères d'une ligne où ces dix caractères correspondent à un motif particulier avec les dix premiers caractères de la ligne ci-dessus? Edit: Il n'était pas clair si je demandais de remplacer les dix premiers caractères où la correspondance pourrait apparaître n'importe où dans la ligne, alors peut-être faire une note dans votre réponse si elle traite de ce cas (appelez ce cas B ? et destiné un cas A)Remplacer le texte de la ligne ci-dessus dans Vim

Répondre

4

Prehaps:

:%s/^\(.\{10}\)\(.*\n\)abcdefghij\(.*\)/\1\2\1\3/ 

Où abcdefghij 'est la chaîne de 10 caractères sur la 2ème ligne

+1

Que faire si le motif que vous voulez faire correspondre n'est pas les 10 premiers caractères de cette ligne? Cela peut ne pas fonctionner dans ce cas. –

+0

@B Johnson la question indique que les 10 caractères sont au début de la ligne. – besen

+0

Nice. Je ne savais pas que les regex de Vim pouvaient couvrir des lignes. – rampion

1

Vous pouvez utiliser la recherche et remplacer:

:7,9 s/foo/bar/c 

Cet exemple recherche de la ligne 7 à 9 pour chaque occurrence de « foo », et le remplace par « bar », demander une confirmation sur chaque coup. Si vous ne voulez pas confirmer, déposez le c à la fin. Choisissez la plage comme bon vous semble et cela devrait vous rendre où vous voulez

+0

C'est exactement ce que je cherchais! Merci! –

2

Si j'ai un complexe action comme ça, je enregistre habituellement une macro en utilisant la commande q. Quelque chose comme (non testé):

/<pattern> 
qq 
10x 
k 
10yl 
j 
P 
n 
q 
question

Et puis repeatedy cette macro comme @q préfixé en option avec un compte.

1

En utilisant uniquement les mouvements de vim et Emmener/coller .. Vu le contenu du fichier de ..

1234567890abcdef 
qwertyuiopasdfgh 

Avec le curseur sur q, 10x, fichier devient:

1234567890abcdef 
asdfgh 

Déplacer le curseur sur la première ligne (en utilisant k le fera), puis faire 10yl (yank 10 caractères, droite)

Puis reculer d'une ligne, j et coller P (majuscules, pour coller sous le curseur) et le fichier devient:

1234567890abcdef 
1234567890asdfgh 

En bref, en commençant par le curseur sur q:

10xk10yljP 

..which vous pouvez coller , ou affecter to a macro

Il serait plus court s'il y avait un raccourci évident pour coller en réécrivant, mais je ne pouvais pas trouver une telle chose

Une autre option est une recherche très obscure recherche regex/remplacer ..

visuelle en ligne sélectionner les deux lignes cibles, et lancez la recherche et de remplacement suivant:

:'<,'>s/\(\(.\{10\}\).*\)\n\(.\{10\}\)\(.*\)$/\1\r\2\4/ 

Fondamentalement, il saisit ..

  • \1 - la totalité de la première ligne
  • \2 - les 10 premiers caractères (dans un groupe imbriqué)
  • un linebreak
  • \3 - les dix premiers caractères de la ligne deux
  • \4 - la reste de la deuxième ligne

Puis il construit les deux lignes comme \1\n\2\4 - première ligne complète, linebreak, 10 premiers caractères du premier, le reste de la deuxième

3

Quelque chose comme ça travailleraient:

%s/^.\{10\}/\=strpart(get(getbufline("", line(".")-1), 0, ""), 0, 10)/ 

^.\{10\} est votre modèle actuel.

%s/      # substitute all lines matching… 
^.\{10\}     # your pattern 
/      # …with… 
\=      # an expression: 
strpart(    # gets the part of a string 
    get(     # gets an element of a list 
    getbufline(   # gets a list of lines from the current buffer 
     "", line(".")-1) # getbufline() the line before the current line 
    , 0, "")    # get() first line in buffer, default to "" 
, 0, 10)     # strpart() first ten characters 
/      # …end of substitution 
3
:2,$g/<pattern>/s/^.\{10}/\=strpart(getline(line(".")-1),0,10) 
  • 2,$ est notre gamme (comme la première ligne n'a pas de ligne précédente)
  • g// vous permet d'exécuter une commande sur les lignes qui correspondent à un modèle donné.
  • s/^.\{10}/ remplacera les 10 premiers caractères d'une ligne
  • \= vous permet de substituer le résultat d'une expression vim dans un :s//
  • line(".") est le numéro de ligne en cours
  • getline(line(".")-1) est le texte de la ligne précédente
  • strpart(getline(line(".")-1),0,10) est les 10 premiers caractères de la ligne précédente

Par exemple 2,$g/frog/s/^.\{10}/\=strpart(getline(line(".")-1),0,10) va changer:

 
I like eating mangos 
before frying frogs legs 
I wish I had a puppy 
She gave Dad a frog 

à ceci:

 
I like eating mangos 
I like eating frogs legs 
I wish I had a puppy 
I wish I had a frog