2010-12-08 6 views
2

Je cherche à récursivité dans un dossier et de remplacer toutes les occurences de {{text in here}} avec %{text in here}grep + sed pour remplacer les caractères entourant une chaîne

J'ai vérifié l'autre grep + sujets sed mais ils ont généralement à voir avec chaîne standard remplacement; Je veux garder la chaîne intacte, mais remplacez certains caractères entourant la chaîne (en remplaçant fondamentalement la première accolade d'ouverture par un % et en supprimant la deuxième accolade de fermeture).

Répondre

1

Essayez regexp comme s/{{\(.*\)}}/%{\1}/

\ 1 dans la deuxième chaîne se substitue avec le contenu de la première (...) paire

+0

Ceci remplacera '{{abc}} def {{ghi}}' avec '% {abc}} def {{ghi}'. –

+0

J'ai effectivement trouvé quelque chose qui fait exactement ce que je voulais (et l'expression régulière est la même que celle que vous avez fournie, bien que la solution soit en ruby). Merci! –

1

Sauf si vous devez utiliser sed pour une raison quelconque, Perl est presque toujours préférable, en raison de sa propre et la syntaxe regex beaucoup plus puissant:

find ... | xargs perl -i~ -pe 's/{{(.*?)}}/%{$1}/g' 

En outre, malgré le fait que -i~ crée une sauvegarde, je recommande fortement de sauvegarder votre arbre entier avant de jouer avec cela. Je ne peux pas compter le nombre de fois que j'ai essuyé le travail en exécutant une ligne de commande cassée deux fois. L'erreur la plus courante est l'utilisation accidentelle de -ne au lieu de -pe, ce qui entraîne l'effacement de toutes les données des originaux. L'exécuter à nouveau remplace les sauvegardes avec les fichiers nouvellement vidés, vous laissant avec rien, mais un sentiment de naufrage dans la fosse de votre estomac.

+0

On pourrait utiliser '-r' sed. – kzh

+0

@kzh: Sur Linux/GNU, oui. Sur BSD/Mac, c'est -E. C'est une autre raison pour laquelle je préfère Perl. –

0

Est-ce que ce travail?

sed 's/{{/%{/g;s/}}/}/g' inputfile 

ou

sed 's/{{\([^}]*\)}}/%{\1}/g' inputfile 
+0

en supposant (devrait être le cas) qu'il n'y a pas de '}' entre '{{' et '}}', donc si Alex assume cela, une solution vraiment simple et bonne – NeronLeVelu

0

Utilisez un caractère temporaire pour permettre l'exclusion ([^³]). Cela suppose qu'il n'y a pas ³ et ² à l'intérieur. Presque n'importe quel autre caractère pourrait être utilisé ou sécurisé avec une première vérification/substitution mais souvent pas nécessaire sur un contenu standard.

sed -e 's/{{/²/g;s/}}/³/g;s/²\([^³]*\)³/%{\1}/g;s/²/{{/g;s/³/}}/g' YourFile 

sur KSH/posix sed

echo "{{abc}} def {{ghi}} jkl {{ mno } {{pqr}}" | sed -e 's/{{/²/g;s/}}/³/g;s/²\([^³]*\)³/%{\1}/g;s/²/{{/g;s/³/}}/g' 

%{abc} def %{ghi} jkl %{ mno } {{pqr} 

note le dernier comportement sur encapsulé {{ mno } {{pqr}}

Questions connexes