[HECnet] Easiest way to do 'sed' type search and replace on VMS...

Johnny Billquist bqt at softjar.se
Sat Feb 9 08:54:30 PST 2013


On 2013-02-09 15:23, G. wrote:
On Sat, 09 Feb 2013 02:21:21 +0100, you wrote:

<fs($(<a href="hecnetinfo.com?q=$;.UAS)$-CQA,.XAI">$GAI</a>$>EX$$

Clear as a spring rain.

Let me know if you want me to explain it... ;-)

Yes please, do! :)

Like I said, clear as spring rain...

Ok, here we go. Written somewhat more "structured":
Anything between exclamation points are comments in TECO (well, technically, they are labels, but what is really the difference between a label and a comment anyway... :-)



<                                                                         ! Start of loop !
  FS($(<a href="hecnetinfo.com?q=$;     ! Search for ( and replace it with all that other crap. The trailing ; after the second escape means that if the search and replace fails we'll exit the loop !
  .UA                                                                 ! Save current position in Q-register A !
  S)$                                                                 ! Search for ) !
  -C                                                                   ! Backup one char !
  QA,.XA                                                           ! Copy text between position in Q-register A and current position into Q-register A !
  I">$                                                               ! Insert the text "> !
  GA                                                                   ! Insert the text from Q-register A !
  I</a>$                                                           ! Insert </a> !
>                                                                         ! End of loop !
EX$$                                                                   ! Exit !


Now, the good tricks to know: In TECO you have Q-registers. Think of them as variables that can store a number and a string (at the same time). TECO always have a current position in the buffer. That is denoted by ".". Functions takes arguments.

So, a thing like the search and replace is FSstr1$str2$, which searches for str1, and if found, replaces it with str2. So the first like is just searching for the next opening paren, and inserts a lot of cruft after the paren. Just plain text constant.

At this point, the current position is just before the nodename. So, we store the position where the nodename starts. (.UA). The command is actually nUq, where n is any number. We just use "." as the number, which is the current position. q is what Q-register to store the value in. So, .UA stores the current position in Q-register A.

S)$ should be very obvious. Just search for the closing paren.

-C should also be pretty obvious. nC moves the position that many steps. If no argument is given, it defaults to 1. -C is just short for -1C.

QA,.XA looks much worse than it is. The basic command is actually m,nXq, which stores the text between m and n in Q-register q. The the XA part should be obvious. Store the text in Q-register A. The stuff before the command is QA,. . At this point, you should realize that n in this case is ".", or the current position. QA is the function to read out the value from Q-register A (Qq to say the function in a general way). So we'll copy the text from the start of the nodename (stored in Q-register A) to the current position, which is right before the right paren, to Q-register A. That is, Q-register A will then hold the nodename. Also, at this point, the current point is after the nodename.

So, we now want to finish the <a href= tag, so we insert a little more text: I">$, which does just that. Position is still right before the right paren, but now we have a full <a> tag in the buffer.

GA gets the text from Q-register A, and inserts it into the buffer. That is the nodename again, now for displaying.

I</a>$ then inserts a little more text, finishing the tagged text.

> is the end of the loop.

EX$$ exits.


See. TECO is actually pretty easy. :-)

	Johnny

-- 
Johnny Billquist                                   || "I'm on a bus
                                                                  ||   on a psychedelic trip
email: bqt at softjar.se                         ||   Reading murder books
pdp is alive!                                         ||   tryin' to stay hip" - B. Idol



More information about the Hecnet-list mailing list