Reg Expressions Egrep

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • playermijp
  • Registratie: Juli 2011
  • Laatst online: 22-09 18:55
Beste,

Ik probeer om met het egrep-commando in linux mbv reguliere expressies een match te vinden. Hoe kan ik ervoor zorgen dat mijn reguliere expressie geldt voor alle voorkomens van bepaalde letters in een regel? Dus als ik bijvoorbeeld de volgende regel heb:

IHNHNKAKNWCGRVRDEYDPMFIKFFARTNQYPTLKHMMHRYWIKPSLKWPKHKDQVHCYKQDPARKH

Dan wil ik ervoor zorgen dat egrep enkel een match vindt wanneer er na elke A een R komt en niet wanneer dit slechts voor 1 A geldt.

Dit is wat ik momenteel heb gemaakt:

egrep '^.*([A]+[R]+)+.*$' eiwitten.txt

Kunnen jullie me helpen?

Alvast bedankt,

[ Voor 13% gewijzigd door playermijp op 11-10-2014 17:07 ]


Acties:
  • 0 Henk 'm!

  • vanaalten
  • Registratie: September 2002
  • Laatst online: 16:40
Waar jouw voorbeeld denk ik op mis gaat:
...AAARR...
Immers, een A mag een of meer keren voor komen voor er en R moet zijn.

Mijn eerste idee:
egrep '^(.*AR)+[^A]*$' eiwitten.txt

... maar da's maar wat gokken. Willekeurige karakters gevolgd door een A en R; die sequentie moet 1 of meer keer voor komen. Na de laatste R mogen er nog nul of meer karakters voor komen, als er maar geen A bij zit (want: als er een A gevolgd door een R nog langskomt, dan valt dat in de eerste repeterende reeks).

Acties:
  • 0 Henk 'm!

Verwijderd

grep -E '^([^A]|AR)*$' eiwitten.txt

Is dit wat je bedoelt? Alles wat geen A is kan worden genegeerd, als er een A voorkomt moet direct daarna een R voorkomen.

Acties:
  • 0 Henk 'm!

  • Hero of Time
  • Registratie: Oktober 2004
  • Laatst online: 01-10 21:30

Hero of Time

Moderator LNX

There is only one Legend

Verwijderd schreef op zaterdag 11 oktober 2014 @ 20:46:
grep -E '^([^A]|AR)*$' eiwitten.txt

Is dit wat je bedoelt? Alles wat geen A is kan worden genegeerd, als er een A voorkomt moet direct daarna een R voorkomen.
Dat werkt niet, want het zoekt dan of de regel begint met een A en dat is niet wat de TS wil. Voer het volgende maar uit, je krijgt dan niets terug.
echo IHNHNKAKNWCGRVRDEYDPMFIKFFARTNQYPTLKHMMHRYWIKPSLKWPKHKDQVHCYKQDPARKH | grep -E '^([^A]|AR)*$'



De vraag van de TS snap ik niet helemaal. Player, kan je wat voorbeelden geven van matches die je wel en niet moet hebben? Want als ik een normale grep uitvoer voor 'AR', krijg ik precies terug wat ik wil, elke match van 'AR' die op elke regel staat, ook als dat meer dan 1x is.

Commandline FTW | Tweakt met mate


Acties:
  • 0 Henk 'm!

  • Raynman
  • Registratie: Augustus 2004
  • Laatst online: 18:00
Hero of Time schreef op zondag 12 oktober 2014 @ 00:31:
De vraag van de TS snap ik niet helemaal. Player, kan je wat voorbeelden geven van matches die je wel en niet moet hebben? Want als ik een normale grep uitvoer voor 'AR', krijg ik precies terug wat ik wil, elke match van 'AR' die op elke regel staat, ook als dat meer dan 1x is.
Hij zegt (maar het is uiteraard mogelijk dat dit toch niet 100% overeenkomt met wat hij echt zoekt):
Dan wil ik ervoor zorgen dat egrep enkel een match vindt wanneer er na elke A een R komt en niet wanneer dit slechts voor 1 A geldt. na elke A moet een R komen.
[...]

Dat werkt niet, want het zoekt dan of de regel begint met een A en dat is niet wat de TS wil. Voer het volgende maar uit, je krijgt dan niets terug.
echo IHNHNKAKNWCGRVRDEYDPMFIKFFARTNQYPTLKHMMHRYWIKPSLKWPKHKDQVHCYKQDPARKH | grep -E '^([^A]|AR)*$'
Dat is dus geen juiste invoer, want ergens bij het begin heb je een A die niet gevolgd wordt door een R. Als je die R toevoegt krijg je wel een match, ook zonder de regel met een A te laten beginnen.

Acties:
  • 0 Henk 'm!

  • analog_
  • Registratie: Januari 2004
  • Niet online
Er zijn een berg websites die je regex in laten voeren en test subjects en vervolgens uitleggen hoe het exact werkt/wat er gebeurd. Erg inzichtelijk allemaal. Heeft hij trouwens geen {2,} modifier nodig?

Acties:
  • 0 Henk 'm!

Verwijderd

Hero of Time schreef op zondag 12 oktober 2014 @ 00:31:

Dat werkt niet, want het zoekt dan of de regel begint met een A en dat is niet wat de TS wil. Voer het volgende maar uit, je krijgt dan niets terug.
Er wordt helemaal niet gezocht of een regel begint met een A. De hele regel moet bestaan uit tekens die geen A zijn. Maar als er toch een A voorkomt, dan MOET er ook een R achter staan. Dat is tenminste wat ik uit de post van de TS haal.

De regex doet exact wat de TS vraag, maar als hij iets anderrs had gewild dan had hij het anders moeten uitleggen.

Acties:
  • 0 Henk 'm!

  • playermijp
  • Registratie: Juli 2011
  • Laatst online: 22-09 18:55
Verwijderd schreef op zondag 12 oktober 2014 @ 01:22:
[...]

Er wordt helemaal niet gezocht of een regel begint met een A. De hele regel moet bestaan uit tekens die geen A zijn. Maar als er toch een A voorkomt, dan MOET er ook een R achter staan. Dat is tenminste wat ik uit de post van de TS haal.

De regex doet exact wat de TS vraag, maar als hij iets anderrs had gewild dan had hij het anders moeten uitleggen.
De regel moet inderdaad helemaal niet met een A beginnen. Wanneer er een A in de regel voorkomt, moet er altijd een R nakomen. Ik wil jullie alvast hartelijk bedanken! Ik ga deze middag de verschillende codes proberen en laat jullie zeker het resultaat weten. De uiteindelijke bedoeling is dus om uit een bestand van ongeveer zo'n 10000 regels die regels te filteren waar er na elke A een R komt, vandaar dat het wel wenselijk was van dit met RegEx te doen ;)

Heel erg bedankt,
Playermijp

Acties:
  • 0 Henk 'm!

  • vanaalten
  • Registratie: September 2002
  • Laatst online: 16:40
Anders wellicht een andere aanpak om het gewenste resultaat te bereiken:

Als eerste alle overduidelijk foute regels greppen:
code:
1
grep "A[^R]" eiwitten.txt > fout.txt

Dan die verwijderen uit de originele file:
code:
1
grep -v -f fout.txt eiwitten.txt > misschiengoed.txt

Wat je overhoudt heeft mogelijk nog een A helemaal op het einde, of misschien helemaal geen A, maar daar kan je met volgende greps wel op filteren.

Altijd leuk en uitdagend om met 1 stap je resultaat te krijgen, maar als je twee uur bezig bent met RegEx spelen of je kan het met een kleine omweg in 5 minuten krijgen...

Acties:
  • 0 Henk 'm!

Verwijderd

Als je het wilt doen met meerdere commando's, kan het meestal nog wel zonder tijdelijke file. Maar grep is dan ook niet de enige tool, voor het verwijderen van regels met (mis)matches is sed veel meer geschikt:
sed -e '/A[^R]/d' -e '/A$/d' eiwitten.txt | grep -F AR

Met / /d kun je regels uit de input stream verwijderen, en dan verwijder je in dit geval inderdaad alle regels die een A hebben gevolgd wordt door een teken anders dan een R (dus A[^R]). De tweede regex is om alle regels die eindigen op een A te verwijderen (dus A$).
Vervolgens houd je alle regels met nul of meer keer AR maar in elk geval geen losse A over. Vandaar nog eventueel de grep -F AR afhankelijk van of je de regels zonder AR wel of niet wilt. Dit geldt overigens ook voor mijn eerdere regex. Die doet effectief hetzelfde als het sed commando.

Acties:
  • 0 Henk 'm!

  • Hero of Time
  • Registratie: Oktober 2004
  • Laatst online: 01-10 21:30

Hero of Time

Moderator LNX

There is only one Legend

Verwijderd schreef op zondag 12 oktober 2014 @ 01:22:
[...]

Er wordt helemaal niet gezocht of een regel begint met een A. De hele regel moet bestaan uit tekens die geen A zijn. Maar als er toch een A voorkomt, dan MOET er ook een R achter staan. Dat is tenminste wat ik uit de post van de TS haal.
Dat verwacht ik wel door dit stuk:
'^([^A]


Ik ben geen expert als 't op regexp uitkomt, dus ik kan 't ook verkeerd lezen.

Commandline FTW | Tweakt met mate


Acties:
  • 0 Henk 'm!

  • blaataaps
  • Registratie: Juli 2001
  • Niet online
^ binnen een character class is negatie, niet beginning-of-line.

Acties:
  • 0 Henk 'm!

  • Hero of Time
  • Registratie: Oktober 2004
  • Laatst online: 01-10 21:30

Hero of Time

Moderator LNX

There is only one Legend

Ah, dan is 't logisch dat er geen uitvoer is, want 't checkt of 't alleen begint met AR, niet met een A gevolgd door een ander teken.

Commandline FTW | Tweakt met mate


Acties:
  • 0 Henk 'm!

  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

vanaalten schreef op zondag 12 oktober 2014 @ 09:59:
Anders wellicht een andere aanpak om het gewenste resultaat te bereiken:

Als eerste alle overduidelijk foute regels greppen:
code:
1
grep "A[^R]" eiwitten.txt > fout.txt

Dan die verwijderen uit de originele file:
code:
1
grep -v -f fout.txt eiwitten.txt > misschiengoed.txt

Wat je overhoudt heeft mogelijk nog een A helemaal op het einde, of misschien helemaal geen A, maar daar kan je met volgende greps wel op filteren.

Altijd leuk en uitdagend om met 1 stap je resultaat te krijgen, maar als je twee uur bezig bent met RegEx spelen of je kan het met een kleine omweg in 5 minuten krijgen...
Waarom in 2 keer?

code:
1
egrep -v 'A[^R]' input.txt > output.txt

ASSUME makes an ASS out of U and ME


Acties:
  • 0 Henk 'm!

  • Kees
  • Registratie: Juni 1999
  • Laatst online: 10:44

Kees

Serveradmin / BOFH / DoC
H!GHGuY schreef op zaterdag 18 oktober 2014 @ 14:01:
[...]


Waarom in 2 keer?

code:
1
egrep -v 'A[^R]' input.txt > output.txt
Dan moet je nog wel alle reeksen zonder A weghalen (als die er al zijn)
code:
1
grep A input.txt| egrep -v 'A[^R]' > output.txt

"Een serveradmin, voluit een serveradministrator, is dan weer een slavenbeheerder oftewel een slavendrijver" - Rataplan


Acties:
  • 0 Henk 'm!

Verwijderd

En de regels eindigend op een A en zo zijn we terug bij mijn post van vorige week.

Acties:
  • 0 Henk 'm!

  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

code:
1
'^(([^A]*)|(.*A[^R].*)|(.*A))$'


Zoiets dan?

Geen idee of performance uberhaupt een probleem is, anders doe je't wat mij betreft met 10 grep's...

ASSUME makes an ASS out of U and ME

Pagina: 1