2010-11-11 4 views
1

Je veux écrire un filtre sed qui change toutes les périodes de son entrée en points d'exclamation, sauf si le point est à la fin d'une ligne, auquel cas la période est remplacée par 2 points d'exclamation (c'est à dire. !!).sed filtre pour remplacer '!' pour les périodes et '!!' pour les périodes à la fin des lignes

Jusqu'à présent, voici ce que j'ai:

sed -e 's/\./\!/g' -e 's/\!\n/\!\!\n/g' input_exp 

où input_exp est un fichier qui a quelques phrases écrites en elle. La commande ne fonctionne pas cependant. Est-ce que '\ n' n'est pas le bon caractère de fin de ligne dans unix/bash? Ai-je besoin d'un '\' supplémentaire avant '\ n'?

Merci pour votre aide.

+0

Le problème principal avec ceci est que le \ n n'est pas remplacé par un saut de ligne lorsque vous placez le motif dans des guillemets simples - il est traité comme une barre oblique littérale et ensuite un n. Si vous mettez le motif entre guillemets, alors vous devez également échapper à la! chars (que vous avez fait inutilement ici). :) La réponse ci-dessous qui utilise un $ au lieu d'un \ n est correcte. Il est probablement aussi légèrement plus rapide de faire les vérifications dans l'ordre inverse, comme dans la réponse de Darioo (puisque cela aurait juste une substitution par ligne, par opposition à deux). – dannysauer

+1

Non seulement cela, mais l'ordre dans lequel l'original est écrit doublera '!' À la fin d'une ligne, qu'il soit ou non un '.'. –

Répondre

3
sed -e 's_\.$_!!_g' -e 's_\._!_g' input_exp 

Je l'ai utilisé _ au lieu de / un degré légèrement plus élevé de readibility. Vous pouvez également utiliser

sed -e 's/\.$/!!/g' -e 's/\./!/g' input_exp 

si vous voulez, bien sûr. \n signifie newline, et n'est pas la même chose que la fin de la ligne.

+0

Le modèle doit être entouré de guillemets simples pour empêcher l'interpolation de variables et les échappements de shell. Cela ne fonctionnera pas réellement avec des guillemets doubles. :) – dannysauer

+1

@dannysauer: Correction :-) J'ai utilisé une version Windows de sed. Vous n'avez pas de fonctionnalités de shell fantaisie * nix dans l'invite de commande Windows, il y a donc rarement une distinction entre guillemets simples et doubles ;-) – darioo

2

Utilisez $ pour 'fin de ligne' à l'intérieur de la regex.

+0

Ai-je besoin d'y échapper? – Sam

+0

Si vous mettez ce motif entre guillemets, vous devriez échapper au symbole du dollar. – dannysauer

Questions connexes