順番に読み進めながら学べます

sed — 置換と抽出

sed 's/a/X/' で各行最初の1つだけ置換しgで行内すべて、sed -n '2p' で特定行だけ表示、sed '/two/d' で一致行を削除、sed -iでファイルを直接書き換える方法を、図解とブラウザ端末で確認します。

文字列を置き換える — s/old/new/ と g

sedはストリームエディタで、入力を1行ずつ受け取り、指定したルールで加工して出力します。最もよく使うのが置換で、sed 's/old/new/'の形で書きます。sは置換、/で区切り、oldnewに置き換える指定です。oldの部分には前章で学んだ正規表現(^ $ . *)も使えます。

末尾にgを付けないs/old/new/は、各行で最初に見つかった1つだけを置換しますs/old/new/gのように末尾にgを付けると、その行に出てくる該当箇所をすべて置換します

書き方意味
s/old/new/各行で最初の1つだけを置換sed 's/a/X/' f
s/old/new/g各行に出てくる該当箇所をすべて置換sed 's/a/X/g' f
s 置換と g フラグの違い
sed 's/a/X/' f各行で最初の a だけ X にsed 's/a/X/g' f各行の a を全部 X に
g無しは行内で最初の1つ、g付きは行内すべてを置換します。
printf 'aaa\nbbb\n' > s.txt   # 素材を作成
sed 's/a/X/' s.txt             # 最初の a だけ Xaa
sed 's/a/X/g' s.txt            # すべての a を XXX

printf 'aaa\nbbb\n' > s.txtで2行の素材ファイルを作成してください。

sedの置換でaXに変える基本形を実行し、各行で最初の1文字だけが置き換わることを確認してください。

③ 続けて、行内すべてを置換するフラグを末尾に付けた形を実行し、aがすべてXに変わることを確認してください。(正しく実行できれば解説が表示されます)

Linux console
0 / 3 実行済み
Loading Linux Terminal...

行を抽出・削除する — -n 'Np' と /pat/d

sed -n 'Np'は N 行目だけを表示します。Nのところに表示したい行番号を入れます(2行目なら2p)。sedは既定で全行を出力するため、-nで自動出力を止め、p(print)で表示したい行だけを明示しますsed -n '2p'なら2行目だけが出ます。

sed '/pat/d'patに一致する行を削除して残りを出力します。dは delete で、/pat/の部分が削除対象の行を選ぶ条件です。特定の語を含む行だけ除外して残りを見たいときに使います。

書き方意味
-n 'Np'N 行目だけを表示sed -n '2p' f
/pat/dpat に一致する行を削除sed '/two/d' f
抽出 -n p と 削除 /pat/d の違い
sed -n '2p' f2 行目だけ表示 (他は出さない)sed '/two/d' ftwo の行を削除し残りを出力
-n 'Np'は指定行だけを取り出し、/pat/dは一致行を除いた残りを出します。
printf 'one\ntwo\nthree\n' > lines.txt   # 素材を作成
sed -n '2p' lines.txt                      # 2 行目の two だけ
sed '/two/d' lines.txt                     # two の行を除いた one と three

printf 'one\ntwo\nthree\n' > lines.txtで3行の素材ファイルを作成してください。

② 自動出力を止めるオプションと、行番号を指定して表示する指定を組み合わせ、sedで2行目だけを表示してください。

③ 続けて、一致する行を削除する指定を使い、twoを含む行を除いた残りを表示してください。

Linux console
0 / 3 実行済み
Loading Linux Terminal...

ファイルを直接書き換える — sed -i

ここまでのsedは結果を画面に出すだけで、元のファイルは変わりませんでした。sed -iを付けると、ファイルを直接書き換えます。設定ファイルの一括置換などに便利ですが、元の内容は残らないため、書き換え後は確認のためにcatで中身を見ましょう。

書き方意味
-iファイルを直接書き換えるsed -i 's/a/Z/' f
sed -i は画面ではなくファイルを変える
sed 's/a/Z/' f結果は画面に出る (f は不変)sed -i 's/a/Z/' ff 自体が書き換わる
-i無しは画面出力のみ、-i付きはファイル本体を書き換えます。

sed -i は元に戻せない

sed -iはファイルをその場で書き換え、元の内容は残りません。本番の設定ファイルに使う前に、まず-i無しで実行して画面で結果を確認し、意図どおりか確かめてから-iを付けるのが安全です。

printf 'apple\nbanana\n' > fruit.txt   # 素材を作成
sed -i 's/apple/cherry/' fruit.txt      # ファイルを直接書き換え
cat fruit.txt                            # cherry と banana を確認

printf 'apple\nbanana\n' > fruit.txtで2行の素材ファイルを作成してください。

② ファイルを直接書き換えるオプションを付けたsedの置換で、applecherryに変えてください。

cat fruit.txtを実行し、ファイル本体がcherrybananaに書き換わっていることを確認してください。

Linux console
0 / 3 実行済み
Loading Linux Terminal...
QUIZ

理解度チェック

まずは1問ずつ答えてみましょう。

Q1sed 's/a/X/' fは各行でどう動きますか?

Q2sed -n '2p' fを実行すると何が表示されますか?

Q3sed -i 's/a/Z/' f-iは何をしますか?