2010-05-24 7 views
2

J'ai une expression grep en utilisant cygwin grep sur Win. Une fois que j'identifie la classe d'émoticônes, cependant, je veux les enlever des données. Cependant, la même expression ci-dessus dans une sed se traduit par une erreur de syntaxe (oui, je me rends compte que je pourrais utiliser/d au lieu de // g, mais cela ne fait pas de différence, j'obtiens toujours l'erreur.)Filtrage des émoticônes en utilisant sed

sed "s/\(\\,,/\|\\m/\|\\m/\\>\.</\\m/\|:u\)*//g" 

la gamme complète est:

grep -a "\\,,/\|\\m/\|\\m/\\>\.</\\m/\|:u" all_fbs.txt | sed "s/\(\\,,/\|\\m/\|\\m/\\>\.</\\m/\|:u\)*//g" | sed "s/^/ROCKON\t/" > rockon_fbs.txt 

le résultat est:

sed: -e expression #1, char 14: unknown option to `s' 

Je sais que ça vient de l'expression régulière sed je demande à ce sujet b/c si je retire cette partie de la ligne complète, alors je ne reçois aucune erreur (mais, bien sûr, e Les émoticônes ne sont pas filtrées).

Merci à l'avance,

Steve

+0

Hm, filtrer les émoticônes? Est-ce lié à [ce produit] (http://stackoverflow.com/questions/2890760)? :-) –

+0

Non, ce n'est pas le cas. Si vous êtes vraiment curieux, ceci est lié à une classe AI où je dois étiqueter certaines données pour former un classificateur, mais évidemment je ne veux pas que le classificateur apprenne les émoticônes sur lesquelles je base les étiquettes! :) – Steve

+0

Vous pouvez probablement obtenir 'sed' pour faire ce que' grep' est en train de faire et combiner les deux appels à 'sed':' sed -n '/ selector/{s /.../.../ g; s /^/.../; p} '> ... 'ou quelque chose comme ça. –

Répondre

1

Vous devez échapper / sinon il prématurément fin à l'expression.

 
s/\(\\,,/\|\\m/\|\\m/\\>\.</\\m/\|:u\)*//g 
     ^ ^ ^ ^^
      These need escaping. 

Vous devez également utiliser des chaînes entre guillemets simples au lieu de chaînes entre guillemets doubles pour éviter que les antislashs interprétées par le shell:

 
$ echo "\\," 
\, 
$ echo '\\,' 
\\, 

Donc, essayez ceci:

 
$ echo 'foo \m/ bar \,,/ baz' | sed 's/\(\\,,\/\|\\m\/\|\\m\/\\>\.<\/\\m\/\|:u\)*//g' 
foo bar baz 
+0

Merci beaucoup! L'âge de non-échappement du/était le problème. Très appréciée! – Steve

+0

Sinon, n'utilisez pas '/' comme séparateurs dans sed. par exemple. 'sed 's; foo; barre;' ' – Sparhawk

Questions connexes