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.