Q1sed 's/a/X/' fは各行でどう動きますか?
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は置換、/で区切り、oldをnewに置き換える指定です。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 |
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
行を抽出・削除する — -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/d | pat に一致する行を削除 | sed '/two/d' f |
-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
ファイルを直接書き換える — sed -i
ここまでのsedは結果を画面に出すだけで、元のファイルは変わりませんでした。sed -iを付けると、ファイルを直接書き換えます。設定ファイルの一括置換などに便利ですが、元の内容は残らないため、書き換え後は確認のためにcatで中身を見ましょう。
| 書き方 | 意味 | 例 |
|---|---|---|
-i | ファイルを直接書き換える | sed -i 's/a/Z/' f |
-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 を確認
理解度チェック
まずは1問ずつ答えてみましょう。
Q2sed -n '2p' fを実行すると何が表示されますか?
Q3sed -i 's/a/Z/' fの-iは何をしますか?