| 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. |