2010-07-11 13 views

Répondre

4

Une gamme de motif est à motifs multiligne. Voici comment vous feriez ça:

sed -n '/pat1/,/pat2/{/pat1\|pat2/!p}' inputfile 
  • -n - ne pas imprimer par défaut
  • /pat1/,/pat2/ - dans les deux modèles inclus
  • /pat1\|pat2/!p - imprimer tout ce qui est pas l'un des motifs

Ce que vous demandez peut-être est ce qui est entre deux modèles sur la même ligne. Une des autres réponses le fera.

Edit:

Quelques exemples:

$ cat file1 
aaaa bbbb cccc 
123 start 456 
this is what 
I want 
789 end 000 
xxxx yyyy zzzz 
$ sed -n '/start/,/end/{/start\|end/!p}' file1 
this is what 
I want 

Vous pouvez le raccourcir en disant sed d'utiliser à nouveau le modèle le plus récent (//):

$ sed -n '/.*start.*/,/^[0-9]\{3\} end 0*$/{//!p}' file1 
this is what 
I want 

Comme vous pouvez voir, je n'ai pas eu à dupliquer la longue regex compliquée dans la deuxième partie de la commande.

+0

hmm, ça marche? J'ai pensé qu'il est plus approprié de remplacer 'pat [12]' au lieu d'utiliser '! p'. C'est bien sûr, si je ne comprends pas mal l'exigence de l'OP. :) – ghostdog74

+0

@ ghostdog74: Je pense que l'OP utilise la mauvaise forme (celle que j'ai dans ma réponse) pour faire ce qu'il veut. Mon dernier paragraphe répond à cela. Votre réponse répond aux deux formes. Je vais ajouter un exemple ou deux. –

+0

merci pour la modification. Qu'en est-il lorsque le motif de début et de fin se trouve sur la même ligne? Par exemple 'commencer c'est le texte que je veux terminer '. Bien que l'OP n'ait pas montré un échantillon de son fichier, je devine qu'il pourrait avoir les deux modèles sur la même ligne. – ghostdog74

0

Je ne connais pas le type de motif que vous avez utilisé, mais je pense que c'est aussi possible avec les expressions régulières.

cat myfile | sed -r 's/^(.*)pat1(.*)pat2(.*)$/\2/g' 
+4

utilisation inutile de chat. – ghostdog74

+2

Vous n'avez pas besoin de capturer le premier et le dernier groupe. –

0

vous pouvez utiliser awk.

$ cat file 
other TEXT 
pat1 text i want pat2 
pat1 TEXT I 
WANT 
pat2 
other text 
$ awk -vRS="pat2" 'RT{gsub(/.*pat1/,"");print}' file 
    text i want 
TEXT I 
WANT 

La solution fonctionne pour des motifs répartis sur plusieurs lignes

2

sed -r 's/pat1(.*)pat2/\1/g' somefile.txt

+1

Vous devez échapper les parenthèses ou utiliser l'option '-r'. –

+0

Merci, édité. – Johnsyweb

Questions connexes