2010-09-28 9 views
0

Je veux supprimer tout le texte entre (et y compris) deux chaînes dans tous les fichiers d'un répertoire. Pour un exemple, les fichiers ressemblent à ceci:Multiline sed option?

flag 
bla bla bal 
bla bla bla 
endflag 

etc.. 

C'est ce que je fais avec sed:

sed -i "s:flag.*endflag::m" * 

Cependant, l'option 'm' ne fait pas partie de Sed. Tous les autres threads de débordement de pile de cette rubrique ont recours à perl, awk ou à un wrapper sed pour y parvenir. N'y a-t-il pas un moyen de dire à sed de faire correspondre les caractères newline?

+1

double possible ([multiligne sed remplacer] http://stackoverflow.com/questions/ 1221245/sed-multiline-replace) –

+0

Colin: ce thread a une solution partielle pour ce que j'essaie de faire: perl -ne 'print if! (M @^

@ .. m @^
$ @)' *. aspx * .htm */*. htm Mais cela ne fait qu'imprimer sur stdout. Comment utiliser cela pour remplacer dans chaque fichier? – nnyby

+0

S'il existe des outils pour faciliter les choses, pourquoi ne pas les utiliser? pourquoi faut-il s'en tenir à sed? – ghostdog74

Répondre

3

En sed vous pouvez spécifier une plage de lignes où la plage est un modèle marquant le début de la plage et un autre motif marquant la fin de la gamme:

sed -i '/flag/,/endflag/d' * 
+0

Hmm, cela semble prometteur, mais ça ne marche pas. La commande exacte que je cours est: sed -i ': : d' * .aspx * .htm */*. Htm – nnyby

+0

Nevermind! Cela a fonctionné quand j'ai utilisé des barres obliques au lieu de deux points. Merci! – nnyby

1

Vous devez copier le texte dans la Tenez le tampon d'abord, que vous pouvez faire correspondre \ n comme n'importe quel autre caractère. Normalement, il n'y a qu'une ligne dans le tampon de maintien à la fois, donc \ n ne fait jamais partie de la chaîne analysée. L'appel suivant copie d'abord la première ligne dans le tampon de maintien (1h) puis ajoute toutes les lignes suivantes dans le tampon de maintien (1! H) et après avoir ajouté la dernière ligne ($) fait le remplacement (s /).

sed -n '1h;1!H;${;g;s/flag.*endflag\n//g;p;}' foo.txt 
2

Pour utiliser autre délimiteur pour spécificateurs de gamme dans sed, vous devez échapper à la première:

sed -i '\:<form:,\:</form>:d' *.aspx *.htm *.html