How to Edit Files with ed
¶
What is ed
¶
ed
is an early text editing tool from the early Unix days. Ken Thompson and
Dennis Ritchie developed the tool after developing QED, a text line editing tool
from Bell Lab’s work on Multics: an Operating System led by MIT and General Electric,
which made large computer systems at the time.
It’s code is still connected to various programming tools: like sed
, patch
, and vi
.
Working with ed
teaches an appreciation of the features of fullpage terminal text editors
like vi
, emacs
, and nano
. Understanding ed
elucidates the value of under utilized
features, like doing substitution in vi
.
If you find yourself trying out a historic Unix system, knowing about ed
can come
in handy. I decided to edit a Makefile in a PDP-11 simuation, and that experience prompted
me to learn a bit about ed
.
The ed
source code is a great example of C programming for someone
who is learning C to examine. ed
is a complicated piece of programming, but
it’s function is clear, it’s pure C, and you are reading a very influencial
piece of software.
The minds that created ed
were some of the early pioneers of
To get started¶
On Debian, you’ll need to install the command to use it:
sudo apt install ed
To read about how to use ed, check out the info
pages. On Debian,
you’ll need to install info
:
$ apt install -y info
$ info ed
ed
commands are entered preceded by the “address” of the command you are calling.
The “address” can be a specifc line number, range of lines, or all of the lines that
match a regular expression.
The info
page for ed
explains the basic commands:
‘(.)a’: append text to the buffer after the addressed line.
‘(.,.)c’: changes lines in the buffer, and text is inserted in their place. Combination of a select, delete, and insert.
‘(.,.)d’: delete the addressed lines from the buffer.
‘(.,.)y’: yank. Copy the current line buffer.
‘(.,.)x’ put. Insert the “yanked” text after the adress specified.
‘(.,.)p’: print. Outputs the content of the adressed line.
‘w’: write to the file. Prints bytes printed after success.
‘e FILE’: Edits FILE, and sets the filename.
‘E FILE’: Edits FILE unconditionally. No warning if you overwrite.
The beginning of the file can be jumped to with ^
while the end of the file is accessed
at $
.
Open a new file¶
To open a new called testfile
:
$ ed testfile
Type in a
and press enter to enter the line buffer. Type
in lines of text, pressing return to start a new line.
to exit the line buffer, type in .
on a new line and press return.
The w
command writes the data (21 bytes in this example), and we enter q
to quit.
a
Line 1
Line 2
Line 3
.
w
21
q
Addressing lines¶
In ed
, we prefix our commands with the “address” of the line we wish to apply our command
to. We can select a single line, a range of lines, or all the lines.
# Select just the third line and print
3p
# Select the print 3rd through last line
3,p
# Select and print all the text (My favorite!)
,p
Edit a line with “c”¶
ed
is kind of clunky, but you can efficiently work on text documents with a little
practice. Let’s save some text and practice editing it.
$ ed testfile2
a
Fizing text with ed.
You maywant to learn how to do subztitution.
Otherwise, you may need to retype lots.
.
w
101
q
Let’s fix “Fizing” the hard way.
$ ed testfile2
101
,p
Fizing text with ed
You maywant to learn to do subztitution.
Otherwise, you may need to retype lots.
# Looks like line 1
1p
Fizing text with ed
# Indeed! now rewrite this line with c!
1c
Fixing text with ed.
.
w
102
q
With the command 1c, we tell ed that we want to replace the first line, and we can retype the whole line. However, there’s a better way to fix a typo.
The substitution command¶
The substitution command allows you to select and replace text efficiently using “regex”: a special syntax for representing patterns in text. At it’s least complicated level, regex can be specifying a specific string. The special syntax is how we match things in a less specific way. For example, “Fizing” is regex that would match “Fizing” because it’s the exact pattern itself, but I could match the same bit of text with “.*zing”.
If you want to hunt down a pattern throughout an entire text file and replace it with a new string, replacing “OLD” with “NEW”:
,s/OLD/NEW/g
If you ommit the “g” at the end, than ed
will only replace the first occurance of the pattern
that it finds.
In this example, it makes sense to hunt down and fix the word with the literal pattern. Next, let’s fix “subztitution” and “maywant”:
$ ed testfile2
102
,p
Fixing text with ed.
You maywant to learn to do subztitution.
Otherwise, you may need to retype lots.
,s/subztitution/substitution/
,p
Fixing text with ed.
You maywant to learn to do substitution.
Otherwise, you may need to retype lots.
,s/maywant/may want/
,p
Fixing text with ed.
You may want to learn to do substitution.
Otherwise, you may need to retype lots.
w
103
q
Of course, these are trivial examples. For more information, see examples from info ed
.
When we leverage substitution in ed
we are basically invoking the fuctionality of sed
,
that lives in ed
. sed
is a powerful command can execute the substitution functionality
of ed
from the shell. While ed
is a neat thing to try out, vi
, emacs
, or nano
are
probably what you want to use instead. sed
is a different story: sed
allows use to pipe
input from all sorts of sources and dynamically edit or filter the output.
ed
may be archaic, but as the system that gave us sed
and ex
which is the meat of the
visual text editor vi
: making ed
awesome in my humble opinion.