The -e
tells sed to execute the next command
line argument as sed program. Since sed programs often contain regular
expressions, they will often contain characters that your shell interprets, so
you should get used to put all sed programs in single quotes so your shell won't
interpret the sed program. In this case, nothing bad would have happened, but
since almost all other examples will contain meta-characters, you really should
get used to quoting your programs. This simple sed program contains a pattern
(``1,10'') and an action (``d''). What sed(1) does is apply all actions whose
pattern match and finally print the line unless the action was ``d''. If you
don't want sed(1) to print each line by default, you can give sed the
-n
option. Then only lines that you print explicitly (with the
``p'' action) appear on stdout.
If we wanted to print only the first ten lines, we would have deleted all the lines starting with 11:
Note that $
is the last line. Because sed(1) processes the input
line by line, it does not keep the whole input in memory. This makes sed(1) very
useful for processing large files, but it has it's drawbacks, too. For example,
we can't use sed -e '$-10,$d'
,
since sed doesn't know $
before the end of file, so it doesn't know
where $-10
is. This is a major problem, and it
limits sed(1)'s usefulness, but sed(1) still has a large number of appliances.
Another way to get only the first 10 lines is to use the -n
option:
If we want to delete only one line, the pattern can be '10,10'
or simple '10'
.
Another possibility is to use the -e
option more than once:
That's why we used the -e
option all the time. In fact, you can
omit it if you have only one command in your program. But you should get used to
the -e
option, so you won't have to add it if you want to extend
your program later on.
log
which contains
thousands of lines. Now you want to delete all the lines that contain the word
``debug'':
This works just like grep -v debug
.
Note that this spawns two grep processes. The sed equivalent would be:
You might wonder why lines with debug aren't printed if they contain foo. The
answer is that the ``d'' action skips the rest of the patterns and actions, too,
it does not just inhibit the print in the end (which is inhibited here due to
the -n
, anyway).
-f
option:
There is a kludge in sed(1) that allows you to set the -n
option
from within your sed program if you use ``#n'' as the first
line in your program file. From now on I will assume that you run the examples
through sed -f
.
The difference between ``i'' and ``a'' is that ``i'' inserts before the current line and ``a'' appends after the current line. So ``1i'' will insert before the first line and ``$a'' will append after the last line.
\t
and nonprintable characters are printed as escaped
three-digit octal numbers. This example is quite useful as shell alias:
which would just change the string ``foo'' to ``bar''.