テキストを置換したい(sed)

$ sed 's/正規表現/置換文字列/g' ファイル名
$ コマンド | sed 's/正規表現/置換文字列/g'

sedは、ファイルの中身をテキスト置換できるコマンドです。 検索・置換パターンは s/検索パターン/置換パターン/g という特徴的な形式です。 1行ずつ検索パターンで検索し、マッチしたテキストを置換できます。

注釈

ファイルの内容を入力とした場合、改行コード(\n)で区切られた行を1行として処理します。

置換した結果は標準出力に表示されます。 コマンドの実行結果をパイプで受け取り、sedで置換して、さらに別のコマンドにパイプしたり、ファイルに書き込む使い方が多いです。

注釈

引数が特徴的なので、Twitterなどで直前の投稿の誤字を訂正するツイートをする場合、 s/誤字のパターン/正しい文字列/ のように書き込むひともいます。

すべて置換したい(s/.../.../g)

$ echo "aaa" | sed 's/a/b/g'
bbb

s/検索パターン/置換パターン/gのように、末尾にg(global)フラグをつけると、1行の中でマッチしたすべての箇所を置換します。

部分置換したい(s/.../.../)

$ echo "aaa" | sed 's/a/b/'
baa

s/検索パターン/置換パターン/だけだと、1行につき最初にマッチした箇所だけを置換します。

ファイルを直接書き換えたい(-i)

$ sed -i '' 's/検索パターン/置換パターン/' ファイル名

-iオプションで、標準出力に結果を表示するのではなく、ファイルの中身を直接書き換えられます。

$ cat ファイル名 | sed 's/検索パターン/置換パターン/g' > ファイル名.tmp
$ mv ファイル名.tmp ファイル名

安全に上書きする場合は、上のように一時ファイルを作ってから元のファイルに上書きする方法もあります。

注意

macOSのsed(BSD版)は、-iのあとにバックアップ用の拡張子を必ず指定する必要があります。 バックアップが不要な場合も、-i ''のように空文字列を渡します。 Linuxでよく使われるGNU版のsedは-iだけで動作するため、そのままではmacOSでエラーになります。

特定の行だけ置換したい(行番号指定)

$ printf "aaa\naaa\naaa\n" | sed '2s/aaa/bbb/'
aaa
bbb
aaa

sコマンドの前に行番号をつけると、その行だけに置換を適用できます。

後方参照を使いたい(\1)

$ echo "2024-01-15" | sed -E 's/([0-9]+)-([0-9]+)-([0-9]+)/\3\/\2\/\1/'
15/01/2024

()で囲んだ部分は、マッチした文字列を\1・\2・\3のように置換パターン側で再利用できます。 -Eオプションで拡張正規表現を有効にすると、()をエスケープなしで使えます。

参考

sdというRust製の代替コマンドがあります。 こちらのほうが引数が覚えやすそうです。