2010-10-13 4 views
0

J'ai un petit script qui Vim fait une recherche sur plusieurs lignes et remplacer:script Vim avec exec trouver

vim -c 's/^ *<hi a=\"26\">\nHello/<td height=\"26\">\r<\/table>\r<bla \/>' \ 
    -c 'w!' -c 'q' test.html 

qui fonctionne. Cependant, quand je mets que dans un exec de trouver pour ce faire récursive dans le répertoire:

find . -iname 'test.html' -exec \ 
    vim -c 's/^ *<hi a=\"26\">\nHello/<td height=\"26\">\r<\/table>\r<bla \/>' \ 
    -c 'w!' -c 'q' \ 
{} \; 

test.html reste inchangé, et Vim me donne cette erreur:

Pattern not found: 
^*<hi a=\"26\">\nHello 
in ./test.html 

C'est vraiment étrange parce que c'est la regex correcte, et je peux la rechercher manuellement dans Vim avec succès.

Pouvez-vous voir des erreurs évidentes avec ma syntaxe de recherche?

+0

Lorsque vous exécutez 'find' avec juste un' '-print' au lieu de -exec', fait il liste test.html correctement? – bstpierre

+0

Oui, ça liste test.html quand je fais simplement -print. Il ouvre avec succès le fichier avec Vim quand je fais -exec. – nnyby

Répondre

3

Je l'ai compris! Le motif de recherche nécessitait un caractère%: vim -c '%s/switch/to/' est la syntaxe correcte.

0

Vous devez échapper les accolades dans la phrase d'exécution (en supposant que vous n'avez pas, peut-être l'affichage du forum a mangé les barres obliques). Il devrait finir \ {\} \;

+0

Merci, j'ai échappé aux accolades. Mon problème d'origine persiste, cependant :( – nnyby

2

Lorsque je fais des choses comme ça, j'ai tendance à le faire dans vim.

:vimgrep /^ *<hi a=\"26\">\nHello/ **/* 

suivi par la création et l'exécution d'une macro récursive:

qbq 
qa (actually you don't press enter after this) 
:silent! !p4 edit % " check out the file 
:e " refresh the r/w status 
:%s/^ *<hi a=\"26\">\nHello/<td height=\"26\">\r<\/table>\r<bla \/> 
:w " no need to force write if it's r/w 
:cnf 
q 
[email protected]@bq 
@b