sedを使って条件に一致した行をテンプレートファイルの内容で置き直す

Bash,CentOS,Linux,Ubuntu

はじめに

あまり使うことがない機能ですが、 sed で特定条件に合致した場合に、テキストファイルの内容を差し込むことができます。

検証環境

$ uname -moi
x86_64 x86_64 GNU/Linux

$ bash -version | head -n 1
GNU bash, version 4.2.46(2)-release (x86_64-redhat-linux-gnu)

準備

10から30までの数値を行ごとに出力します。
以下のコマンドを利用します。

$ seq 10 30
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

この出力内容のうち、 3 が含まれている行の後ろに任意のテキストファイルの内容を差し込んでみます。

$ cat template.txt
「さん」がふくまれています!

sed コマンドの r 内部コマンドを利用する

sed コマンドには r という内部コマンドがあります。
r の後ろに指定したファイルから内容を読み込んで差し込みます。

$ seq 10 30 | sed '/3/r template.txt'
10
11
12
13
「さん」がふくまれています!
14
15
16
17
18
19
20
21
22
23
「さん」がふくまれています!
24
25
26
27
28
29
30
「さん」がふくまれています!

3 が含まれている行の後ろに 「さん」がふくまれています! というテキストが表示されていることがわかります。

/3/r template.txt というコマンドのうち、 r の前に記述されている /.../ の部分は処理対象行を検索する条件となります。
3 を含む行を検索し、この行の後ろにファイルの内容を差し込みます。

sed コマンドの r 内部コマンドで行を置換したい

先の例だと 3 を含む行はそのまま残っていますが、これを出力させたくないというケースが多いと思います。
その場合は以下のようにコマンドを修正しましょう。

$ seq 10 30 | sed -n '/3/!p; /3/r template.txt'
10
11
12
「さん」がふくまれています!
14
15
16
17
18
19
20
21
22
「さん」がふくまれています!
24
25
26
27
28
29
「さん」がふくまれています!

-n オプションで出力を抑制し、 /3/!p3を含まない行のみを出力 させます。
あとは先程のコマンド( /3/r template.txt )を実行させます。

ひとこと

こちらの機能を有効活用しているケースを是非教えて下さい。

Bash,CentOS,Linux,Ubuntu