sedのcコマンドを使って条件に合致した行を別の文字列で置き換える

2023-03-27Bash

はじめに

個人的に sed で最もよく使われる内部コマンドは s コマンドです。

例えば、出力された文字列の中の 1@ に置換する場合は以下のように記述できます。

$ seq 10 15
10
11
12
13
14
15

$ seq 10 15 | sed 's/1/@/g'
@0
@@
@2
@3
@4
@5

あまり使う機会がありませんが、同じように「置き換え」を行う sed の内部コマンドとして c コマンドがあります。

c コマンドについて紹介します。

検証環境

$ uname -moi
aarch64 aarch64 GNU/Linux

$ head -n 3 /etc/os-release
PRETTY_NAME="Ubuntu Kinetic Kudu (development branch)"
NAME="Ubuntu"
VERSION_ID="22.10"

$ bash -version | head -n 1
GNU bash, バージョン 5.2.0(1)-release (aarch64-unknown-linux-gnu)

c コマンドは条件に合致した行を別の文字列で置き換える

c コマンドは条件に合致した行を別の文字列で置き換えるコマンドになります。

s コマンドとの違いは、置き換えの単位にあります。

s コマンドでは s/検索キーワード/置換文字列/ のように記述し、 「検索キーワード」 に合致した文字列のみを 「置換文字列」 に置き換えます。

c コマンドでは、 「行」をまるごと置き換えます

具体亭を見ていきましょう。

「キーワード」を使って対象行を指定する

まずは seq コマンドで 2 から 20 までの 2 の倍数を出力してみます。

$ seq 2 2 20
2
4
6
8
10
12
14
16
18
20

ここから、 2 を含む行をみつけ、 HELLO という文字列に置き換えてみます。

$ seq 2 2 20 | sed '/2/c HELLO'
HELLO
4
6
8
10
HELLO
14
16
18
HELLO

「アドレス(行番号)」を使って対象行を指定する

アドレスを指定して対象行を置換する事もできます。

1 行目を置換してみます。

$ seq 2 2 20 | sed '1c HELLO'
HELLO
4
6
8
10
12
14
16
18
20

開始アドレス、終了アドレスを使って範囲指定することもできます。
2 行目から 5 行目を置換してみます。

$ seq 2 2 20 | sed '2,5 c HELLO'
2
HELLO
12
14
16
18
20

$ で最終行を指定できます。

$ seq 2 2 20 | sed '5,$ c HELLO'
2
4
6
8
HELLO

ひとこと

s 内部コマンドとの違いは複数行をいっぺんに対象とする点になります。
複数行をまとめて 1 行に置き換える、といった場合は c 内部コマンドを使用することになります。

2023-03-27Bash