Difference between revisions of "Regular Expression Perl/Oneliners"

From Teknologisk videncenter
Jump to: navigation, search
m (One-liners)
m
Line 1: Line 1:
== Links ==
+
= Links =
 
*[[Media:Regexp Quick Reference.pdf|Regular Expression Quick Reference Guide]]
 
*[[Media:Regexp Quick Reference.pdf|Regular Expression Quick Reference Guide]]
 
*[http://www.regextester.com Regular Expression test web-site]
 
*[http://www.regextester.com Regular Expression test web-site]
== One-liners ==
+
= One-liners =
===confusing===
+
==confusing==
 
Onelineren nedenunder finder i alle filer som hedder .txt som extension steder hvor der står Fahrenheit temperaturer - fx. 56F - og udskifter dem med Celcius temperaturer - fx. 12C.
 
Onelineren nedenunder finder i alle filer som hedder .txt som extension steder hvor der står Fahrenheit temperaturer - fx. 56F - og udskifter dem med Celcius temperaturer - fx. 12C.
 
<source lang=cli>
 
<source lang=cli>
 
perl -pi -e 's{([-+]?\d+(\.d*)?)F\b}{sprintf "%.0fC",($1-32)*5/9}eg' *.txt
 
perl -pi -e 's{([-+]?\d+(\.d*)?)F\b}{sprintf "%.0fC",($1-32)*5/9}eg' *.txt
 
</source>
 
</source>
==== Forklaring ====
+
=== Forklaring ===
 +
==== perl aktivering ====
 
Progammet startes med '''perl -pi -e 'ONELINER'''' hvor
 
Progammet startes med '''perl -pi -e 'ONELINER'''' hvor
 
*perloption p = Loop oneliner og indlæs filer linie for linie '''*.txt'''
 
*perloption p = Loop oneliner og indlæs filer linie for linie '''*.txt'''
Line 15: Line 16:
 
*perloption = programlinie eller onliner.
 
*perloption = programlinie eller onliner.
  
 +
==== Search and replace ====
 
Eksemplet ovenfor anvender search and replace funktionen '''s/PATTERN/REPLACE/''' som også kan skrives '''s{PATTERN}{REPLACE}'''. Se herunder.
 
Eksemplet ovenfor anvender search and replace funktionen '''s/PATTERN/REPLACE/''' som også kan skrives '''s{PATTERN}{REPLACE}'''. Se herunder.
 
<source lang=cli>
 
<source lang=cli>
Line 24: Line 26:
 
*Option g = global. Erstat alle der matcher. Ikke kun en gang.
 
*Option g = global. Erstat alle der matcher. Ikke kun en gang.
  
===== Søge pattern =====
+
==== Søge pattern ====
 
Mønstret der søges efter i filerne - linie for linie - er '''([-+]?\d+(\d+(\.d*)?)F\b''' Se herunder.
 
Mønstret der søges efter i filerne - linie for linie - er '''([-+]?\d+(\d+(\.d*)?)F\b''' Se herunder.
 
<source lang=cli>
 
<source lang=cli>
Line 31: Line 33:
  
 
Der ledes i linerne efter Fahrenheit grader skriver som for eksempel '''12F, +12F, -12F, +12.123F''' og den numeriske del huskes. Altså ved +12.12F huskes +12.42.
 
Der ledes i linerne efter Fahrenheit grader skriver som for eksempel '''12F, +12F, -12F, +12.123F''' og den numeriske del huskes. Altså ved +12.12F huskes +12.42.
 +
===== Paranteserne i pattern =====
 +
I Eksemplet herunder ses to måder at anvende paranteser på.
 +
*De hvide paranteser er anvendt som '''capture''', altså det der matcher inde i de hvide paranteser skal huskes.
 +
*De blå paranteser anvendes som '''grouping'''. Det kan ses ved at der anvendes ''?'' lige efter som betyder at det i de blå paranteser kan ske 0 eller 1 gang. (Enten er der decimaler i gradantallet eller også er der ikke.)
 
<source lang=cli>
 
<source lang=cli>
perl -pi -e 's{<input>([-+]?\d+(\.d*)?)</input>F\b}{sprintf "%.0fC",($1-32)*5/9}eg' *.txt
+
perl -pi -e 's{<input>(</input>[-+]?\d+<notice>(</notice>\.d*<notice>)</notice><error>?</error><input>)</input>F\b}{sprintf "%.0fC",($1-32)*5/9}eg' *.txt
 
</source>
 
</source>
 
   
 
   

Revision as of 10:09, 3 October 2009

Links

One-liners

confusing

Onelineren nedenunder finder i alle filer som hedder .txt som extension steder hvor der står Fahrenheit temperaturer - fx. 56F - og udskifter dem med Celcius temperaturer - fx. 12C.

perl -pi -e 's{([-+]?\d+(\.d*)?)F\b}{sprintf "%.0fC",($1-32)*5/9}eg' *.txt

Forklaring

perl aktivering

Progammet startes med perl -pi -e 'ONELINER' hvor

  • perloption p = Loop oneliner og indlæs filer linie for linie *.txt
    • Svarer til "while (<>) { ... }" omkring din Oneliner.
  • perloption = Editer filer direkte
  • perloption = programlinie eller onliner.

Search and replace

Eksemplet ovenfor anvender search and replace funktionen s/PATTERN/REPLACE/ som også kan skrives s{PATTERN}{REPLACE}. Se herunder.

perl -pi -e '<input>s{</input>([-+]?\d+(\.d*)?)F\b<input>}{</input>sprintf "%.0fC",($1-32)*5/9<input>}</input><notice>eg</notice>' *.txt

Search and replace funktionen anvender options e og g. Se med blåt ovenfor

  • Option e = Betragt REPLACE delen af searchfunktionen som et Perl expression - altså som program og ikke tekst. (sprintf funktionen)
  • Option g = global. Erstat alle der matcher. Ikke kun en gang.

Søge pattern

Mønstret der søges efter i filerne - linie for linie - er ([-+]?\d+(\d+(\.d*)?)F\b Se herunder.

perl -pi -e 's{<input>([-+]?\d+(\.d*)?)F\b</input>}{sprintf "%.0fC",($1-32)*5/9}eg' *.txt

Der ledes i linerne efter Fahrenheit grader skriver som for eksempel 12F, +12F, -12F, +12.123F og den numeriske del huskes. Altså ved +12.12F huskes +12.42.

Paranteserne i pattern

I Eksemplet herunder ses to måder at anvende paranteser på.

  • De hvide paranteser er anvendt som capture, altså det der matcher inde i de hvide paranteser skal huskes.
  • De blå paranteser anvendes som grouping. Det kan ses ved at der anvendes ? lige efter som betyder at det i de blå paranteser kan ske 0 eller 1 gang. (Enten er der decimaler i gradantallet eller også er der ikke.)
perl -pi -e 's{<input>(</input>[-+]?\d+<notice>(</notice>\.d*<notice>)</notice><error>?</error><input>)</input>F\b}{sprintf "%.0fC",($1-32)*5/9}eg' *.txt