Title: Fun tip #1: Apply a diff with ed | |
Author: Solène | |
Date: 13 November 2018 | |
Tags: fun-tip unix openbsd | |
Description: | |
I am starting a new kind of articles that I chose to name it ”fun | |
facts“. | |
Theses articles will be about one-liners which can have some kind of | |
use, or | |
that I find interesting from a technical point of view. While not | |
useless, | |
theses commands may be used in very specific cases. | |
The first of its kind will explain how to programmaticaly use diff to | |
modify | |
file1 to file2, using a command line, and without a patch. | |
First, create a file, with a small content for the example: | |
$ printf "first line\nsecond line\nthird line\nfourth line with | |
text\n" > file1 | |
$ cp file1{,.orig} | |
$ printf "very first line\nsecond line\n third line\nfourth line\n" | |
> file1 | |
We will use [diff(1)](https://man.openbsd.org/diff) `-e` flag with the | |
two | |
files. | |
$ diff -e file1 file1.orig | |
4c | |
fourth line | |
. | |
1c | |
very first line | |
. | |
The diff(1) output is batch of [ed(1)](https://man.openbsd.org/ed) | |
commands, | |
which will transform file1 into file2. This can be embedded into a | |
script as | |
in the following example. We also add `w` as the last command in order | |
to save the file after changes. | |
#!/bin/sh | |
ed file1 <<EOF | |
4c | |
fourth line | |
. | |
1c | |
very first line | |
. | |
w | |
EOF | |
This is a convenient way to transform a file into another file, without | |
pushing the entire file. This can be used in a deployment script. This | |
is less error prone than a sed command. | |
In the same way, we can use ed to alter configuration file by writing | |
instructions without using diff(1). The following script will change | |
the | |
first line containing "Port 22" into Port 2222 in /etc/ssh/sshd_config. | |
#!/bin/sh | |
ed /etc/ssh/sshd_config <<EOF | |
/Port 22 | |
c | |
Port 2222 | |
. | |
w | |
EOF | |
The sed(1) equivalent would be: | |
sed -i'' 's/.*Port 22.*/Port 2222/' /etc/ssh/sshd_config | |
Both programs have their use, pros and cons. The most important is to | |
use the | |
right tool for the right job. |