Scripting with ed and here documents
------------------------------------

Last edited: $Date: 2018/08/20 18:27:50 $


Ed is the standard editor and although  it is very old it is still a
very useful and powerful editor.

Ed is  made to  be used  interactively, but  we can  also use  it in
scripts. The use of here documents is one way to do this.

A simple example:

   ed -s myfile << EOF
   a
   A new line
   .
   w
   EOF


## Remove from the first line to line with some pattern

A handy way of  removing the lines from the start of  a text file to
some arbitrary  line containing  a certain pattern,  is to  use line
labels. In Ed, we can label a line with the `k' command, like this:

   kx

This  gives the  line  the label  ``x'', which  we  address with  'x
(apostrophe, immediately followed by the label name).

So, if we want to remove the preamble of a Latex document this would
do the trick:

   ed -s mylatexfile << EOF
   H
   /\\\begin{document}/
   kx
   1,'xd
   w
   EOF

The first line toggles the explanation flag (`H').

The second line searches for \begin{document}. We have to escape the
backslash with extra  backslashes, because of the shell  we run this
script from.

The line  `kx' is used to  label the line with  the \begin{document}
pattern.

The line  `1,'xd' deletes all the  lines from the first  to the line
with the \begin{document} pattern.

The last line `w' is to write the buffer back to disk.


## Replace from the first line  to line with some pattern with other
text

If we want to replace the  deleted preamble with a different one, we
can  no give  the command  `1i', meaning  "go to  line 1  and insert
before that":

   ed -s mylatexfile << EOF
   H
   /\\\begin{document}/
   kx
   1,'xd
   1i
   \documentclass [english,useplainpaper]{article}
   ....
   ....
   last insert line
   .
   w
   EOF

The text to insert can be arbitrary long, it does not have to be the
same number of lines as the number of deleted lines.

Don't forget to end the insert  of lines with a line containing only
a single dot, to end the insert-mode.


## Direct addressing the line with the search pattern

A shorter  way to  remove from the  first line to  a line  with some
pattern is to direct it directly, like this:

   ed -s mylatexfile << EOF
   H
   1,/\\\begin{document}/d
   w
   EOF

Sometimes,  using the  first  method,  with adding  a  label to  the
specific line, it is easier to understand.


## Learn Ed and prosper

Of course, this are some silly examples, Ed can do so much more :)

If you have not done yet,  learn yourself some basic Ed and practice
until you  get comfortable  with it,  and than  start to  write some
scripts with  here-documents. The  time you invest  on this  is well
worth it, you'll acquire a skill that can be extremely useful in the
future.


$Id: edwithheredocuments.txt,v 1.4 2018/08/20 18:27:50 matto Exp $