Regular Expression Perl/Oneliners

From Teknologisk videncenter
< Regular Expression Perl
Revision as of 10:02, 3 October 2009 by Heth (talk | contribs) (Forklaring)
Jump to: navigation, search

Links

One-liners

confusing

Onelineren nedenunder finder i alle *.txt 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

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.

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.

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