2010-12-11 7 views
1

Je veux de détecter le modèle suivant dans FILE_1:avec sed avec l'expression régulière

STRING_1 : "STRING_2" 

et append STRING_2, à FILE_2

C'est ce que j'ai en ce moment:

sed 's/STRING_1\s*:\s*"\([^"]*\)"/\1/g' FILE_1 >> FILE_2; 

mais cela ne fonctionne pas, il ajoute beaucoup de choses aléatoires à FILE_2 (qui ne sont pas supposées correspondre). Je ne sais pas ce que je fait de mal ...

+2

Pouvez-vous donner un exemple de l'entrée où elle échoue? – codaddict

Répondre

1

Un peu de risque de répondre en changeant la spécification de question mais ...

perl -ne 'print "$1\n" if (/.*STRING_1\s*:\s*\"([^"]*)\".*/)' FILE_1 >> FILE_2 

semble fonctionner correctement

1

S'il y a du texte avant et après STRING_1STRING_2, ça va pas être enlevé avec votre regex en cours et, par conséquent va se joint à FILE_2.

Pour résoudre ce problème ajouter .* au début et à la fin de votre modèle actuel comme:

sed 's/.*STRING_1\s*:\s*"\([^"]*\)".*/\1/g' FILE_1 >> FILE_2; 
     ^^       ^^ 
+0

Cela signifie que votre regex ne fonctionne pas. Donnez-nous quelques exemples de lignes de votre contribution. – codaddict

0

changé à:

sed 's/.*STRING_1\s*:\s*"\([^"]*\)".*/\1/g' FILE_1 >> FILE_2;   

mais il ajoute encore tout le fichier au lieu de regex match

0

Utilisez sed -n si vous ne voulez pas sed à la sortie de chaque ligne par défaut et le modificateur p d'imprimer le résultat d'un match.

sed -n -e 's/foo/bar/gp' FILE_1 >> FILE_2