At some point I really wanted to implement the simplest editor, namely ed (it would be much better than any APL system has offered), in APL, but I never finished the regex part. Perhaps it would be a nice exercise for someone who’s interested in learning APL to actually implement some of the most used Unix command line utilities.
> On Jun 21, 2016, at 8:53 PM, Christian Robert <christian.rob...@polymtl.ca> > wrote: > > Hi, > > A more general purpose search&replace (some bug fixed), take (2), was "snr". > > > > )sic > )erase replace > ∇z←s replace p;fr;to;P;i;⎕io > ⍝ ------------- > →(2≤≡s)/ForEach > →(2≤⍴⍴s)/Matrix > →Vector > ⍝ ------------- > ForEach: z←{⍵ replace p}¨s ◊ →0 > Matrix: z←⊃ {⍵ replace p}¨ ⊂[2]s ◊ →0 > ⍝ ------------- > Vector: p←,¨p ◊ z←s←,s ⋄ ⎕io←1 > Loop:→((⍴p)<2)/0 > (fr to)←2↑p ◊ p←2↓p > P←¯1↓∧/[1](¯1+⍳⍴fr)⌽fr∘.=z,⎕ucs 1 > i←0 > Sanitize: i←i+1 > →(i>(⍴P)-⍴fr)/Substitute > →(0=P[i])/Sanitize > ((⊂ i+¯1+⍳⍴fr)⌷P)←(⍴fr)↑1 > →Sanitize > Substitute: P←⌽(P/⍳⍴P) > ⊣ {z←((¯1+⍵)↑z),to,(¯1+⍵+⍴fr)↓z}¨P > →Loop > ∇ > > It should be vector, matrix and embedded objects "aware" (as long as it is > all text) > > Syntax: > > source replace "this" "by_that" "this" "by_that" [...] (eg: pairs of "from" > and "to") > > Examples: > > (⎕cr 'replace') replace 'replace' 'snr' 'ForEach' "Each" "Substitute" > "Subst" "Sanitize" "Sane" > z←s snr p;fr;to;P;i;⎕io > ⍝ ------------- > →(2≤≡s)/Each > →(2≤⍴⍴s)/Matrix > →Vector > ⍝ ------------- > Each: z←{⍵ snr p}¨s ◊ →0 > Matrix: z←⊃ {⍵ snr p}¨ ⊂[2]s ◊ →0 > ⍝ ------------- > Vector: p←,¨p ◊ z←s←,s ⋄ ⎕io←1 > Loop:→((⍴p)<2)/0 > (fr to)←2↑p ◊ p←2↓p > P←¯1↓∧/[1](¯1+⍳⍴fr)⌽fr∘.=z,⎕ucs 1 > i←0 > Sane: i←i+1 > →(i>(⍴P)-⍴fr)/Subst > →(0=P[i])/Sane > ((⊂ i+¯1+⍳⍴fr)⌷P)←(⍴fr)↑1 > →Sane > Subst: P←⌽(P/⍳⍴P) > ⊣ {z←((¯1+⍵)↑z),to,(¯1+⍵+⍴fr)↓z}¨P > →Loop > > > You can even try "⎕fx" the result if it looks like Ok. (ps: always check the > result before committing) > > Substitutions are done in pair sequence for each /vector/matrix/embedded obj. > > So replace order is *very* important. > > It must still have some bugs, report them to me, with examples if so. Will do > my best but no promises. > > Purpose: well, not sure, it was an exercise. I used it on itself to finally > rename the function and change some variables/labels names. > > > Features: would be fun to pass parameters to each of the /from/to/ like > maximum number of substitutions to do per line ... > whole words only (taking apl characters as blanks) ... so variable > "s" won't match last character of variable "pairs" > ... no limits > > > Xtian. > > > On 2016-06-21 12:27, Juergen Sauermann wrote: >> Hi Xtian, >> >> how about this: >> >> * >> **s←"444This4is4a4444test44with44444lot4of4blanks4444at4beginning4and444end444444"** >> from←"444"** >> ** to←"5"** >> ** >> ** ↑⍎')HOST echo "',s,'" | sed s/',from,'/',to,'/g'** >> **5This4is4a54test44with544lot4of4blanks54at4beginning4and5end55** >> ** ** >> *I have replaced the *^* in your example because it (and some other >> characters) have a special meaning in >> regular expressions. But the special characters can be easily quoted in APL >> if needed, for example: >> >> * >> s←"^^^This^is^a^^^^test^^with^^^^^lot^of^blanks^^^^at^beginning^and^^^end^^^^^^" >> ** >> ** ((s='^')/s)←⊂'\^'** >> ** ⊃,/s** >> **\^\^\^This\^is\^a\^\^\^\^test\^\^with\^\^\^\^\^lot\^of\^blanks\^\^\^\^at\^beginning\^and\^\^\^end\^\^\^\^\^\^** >> * >> /// Jürgen >> >> >> On 06/21/2016 05:12 AM, Christian Robert wrote: >>> Hi, it's not a bug but a request for help, >>> >>> >>> suppose >>> s="^^^This^is^a^^^^test^^with^^^^^lot^of^blanks^^^^at^beginning^and^^^end^^^^^^" >>> suppose from="^^^" >>> suppose to="^" >>> >>> I need a function who can replace ("^^^" to "^"), or ("^" to "^^^^^^^^") or >>> ("" to "blabla" with limits of source size) ie: without being lost in >>> infinite loop. >>> >>> >>> >>> "s" is a character vector, "from" is a character vector, and "to" is a >>> character vector, >>> both "s", "from" and "to" can be "". >>> >>> >>> >>> I'm pretty sure this idiom already exist. >>> >>> if you can help me, please do. >>> >>> Xtian. >>> >>> >>> >>> >>> >>> >>