Answers to Part 4 Exercises

Solution to k37 Problem


% substitute /\(.*\)k37\(.*k37\)/\1q53\2

will do it. When there are two or more wild cards in a search pattern, the editor finds the longest match for the first one that allows any match for the subsequent ones, and so on.

Back to the question


Solution to Capitalization Problem


237 , 289 substitute :[^ ]*:\L\u&:g

Since the ``\u'' and ``\l'' metacharacters have limited reach, they don't end the effect of a ``\L'' or ``\U'' metacharacter--they only make a one-character exception.

Author's Note: Since I wrote this solution, I have learned that it will not work under many implementations of the editor. So, I've added below an alternate solution, more complex but more powerful, that should work everywhere.


237 , 289 substitute :\([A-Za-z]\)\([A-Za-z-]*\):\u\1\L\2:g

Even in editing environments where my first solution would work, the second one has certain advantages:

Back to the question


Answer to No-Op Problem

The editor thinks a substitution has been successfully made whenever the outgoing search pattern is matched and no error condition is encountered, even if it is only replacing nothing with nothing. So when the editor finishes up by reporting the number of substitutions it has made, it is giving me a count of the empty lines in my file, which tells me how many paragraphs plus headlines plus list items I have. Then I divide this number into the count of lines in the file, to see whether my paragraphs have gotten too long.

Back to the question


Solution to HTML tags problem

Where the substitution command to add a tag at the start of a paragraph presently removes and then replaces any first character on the line, now it should remove and replace anything except a ``<'' character in that position. If that first character is a ``<'' it is necessary that the substitution command fail so it will change nothing. To arrange this, replace that period in the search pattern with a negative character class -- ``[^<]'' -- which matches any character except the one that begins every HTML tag.

Similarly, replace the period in the other substitution pattern with the negative character class that matches any character except the one that always ends an HTML tag. Now the two commands will look like this:


global /^$/ + substitute /^[^<]/<P>&/
global /^$/ - substitute :[^>]$:&</P>:

Back to the question


Back to the index