2010-10-23 5 views
0

Je possède ce regex travail (testé sur l'entraîneur regex):egrep regex ne fonctionne pas sur regex qui fonctionne dans d'autres programmes

\n[\s]*[0-9]*[\s]*[0-9]*(\.)?[0-9]*(e\+)?[0-9]* 

qui est censé ramasser les 2 premières colonnes de ce fichier

http://wwwhomes.uni-bielefeld.de/achim/highly.txt

je lis à travers les pages de manuel, et il dit que^correspondra au beggining de la ligne donc j'ai remplacé \ n avec^ mais egrep n'est pas d'accord avec moi quand je fais ceci:

egrep -e ^[\s]*[0-9]*[\s]*[0-9]*(\.)?[0-9]*(e\+)?[0-9]* "wwwhomes.uni-bielefeld.de achim highly.txt" 

EDIT: il a quelque chose à voir avec (e\+)?

EDIT 2: D'accord, je simplifie l'expression rationnelle. oublier d'essayer d'obtenir des chiffres en notation scientifique ici est ce que je suis en utilisant:

egrep -e "^[[:space:]]*[0-9]*[[:space:]]*[0-9]*" "wwwhomes.uni-bielefeld.de achim highly.txt" 

il renvoie les lignes d'en-tête:

no  number  divisors 2 3 5 71113171923293137414347535961677173 
------------------------------------------------------------------------------ 

ce n'est pas juste ...

modifier finale :

J'avais besoin d'une combinaison de grep et sed pour obtenir les bonnes données. grep supprimé les lignes d'en-tête et le texte formaté sed

grep -E -o -e "^[[:space:]]+[0-9]+[[:space:]]+[0-9e\+\.]+[[:space:]]+[0-9e\+\.]+" "wwwhomes.uni-bielefeld.de achim highly.txt" >grepped.txt 

sed -r "s/^\s*[0-9]+\s*([0-9.e+]+)\s*([0-9.e+]+)/\1,\2/" "grepped.txt" >seded.txt 
+0

De quelle façon est-ce "non d'accord"? – justintime

+0

Vous devez mettre votre expression régulière entre guillemets. Les caractères '[]() *? \' Ont tous une signification spéciale pour le shell. –

+0

@Adam: fait, pas bon – mna

Répondre

2

ERE ne supporte pas \s. Utilisez [[:space:]] pour \s ou simplement .

Il semble que les ^ points au début du texte qui ne permettent pas encore. Je ne sais pas pourquoi. (Ce comportement est vrai sur grep (GNU grep) 2.5.1 sur Mac OS X uniquement?)

La regex correspond aux lignes d'en-tête car tous les éléments de la regex sont facultatifs. Vous devez changer certains de ces * en +.


Depuis le fichier est en format de longueur fixe, il est beaucoup plus facile à utiliser cut que la construction d'un regex. Vous pouvez utiliser grep -v pour filtrer les résultats indésirables.

+0

Noté, problème toujours là. Comment puis-je le forcer à ne correspondre qu'au début de la ligne? Il semble que egrep ne se soucie pas que j'ai ajouté^ – mna

+0

Noté, mais cela ne se débarrasse pas des en-têtes qui se reproduisent – mna

1

Essayez d'ajouter une option -o à grep pour le faire imprimer seulement la partie qui correspondait à la tendance au lieu de la ligne qui a le motif:

egrep -o -e "^[[:space:]]*[0-9]*[[:space:]]*[0-9.e+]*" file 
     ^^ 

Working link

vous pouvez également utiliser Sed:

sed -r 's/^\s*([0-9]+)\s*([0-9.e+]+).*/\1 \2/' file 
+0

Merci. Pouvez-vous me dire quel outil je pourrais utiliser pour faire quelque chose comme "^ [[: space]] * ([0-9] *) [[: space:]] * ([0-9.e +] *)" -output "\ 1, \ 2"? Je suis nouveau à tout bash: S – mna

+0

Ce serait 'sed'. Je vais mettre à jour la réponse avec ça. – codaddict

0

si vous avez des données qui ressemble bien formaté, avec délimiteurs que vous pouvez identifier (par exemple, dans votre cas, ta bs/spaces), il n'est pas nécessaire d'utiliser regex. Utilisez awk.

awk '!/--/&&$1!="no"{print $1,$2}' file 

Je crois que ce revêtement est un tout ce que vous avez besoin puisque vous avez dit que vous voulez obtenir les 2 premières colonnes et sauter les en-têtes. vous pouvez aussi utiliser cut, mais ce n'est pas aussi flexible que awk.

+0

Comment est-ce que je supprime les lignes 'no-number' awk retourne? – mna

+0

le seul paquebot le fait déjà. Voir que '$ 1! =" Non "'? – ghostdog74

+0

$ 1! = "Non" espaces blancs :) – mna

Questions connexes