sedコマンドで置換処理 macOS/Linux/Unixシェルコマンド

macOSでのsedコマンドの基本的な使い方を説明します。sedはストリームエディタで、テキストファイルやパイプからの入力に対して行単位の編集を行うことができます。テキストの加工や置換処理など、データの前処理に非常に便利なツールです。

【sedまとめ】 sedの基本的な使い方

コマンド説明
sed 's/検索パターン/置換文字列/' ファイル名ファイル内で最初にマッチした検索パターン置換文字列に置換します。
sed -i '' 's/検索パターン/置換文字列/' ファイル名ファイル内で最初にマッチした検索パターン置換文字列に置換し、ファイルを直接更新します(インプレース編集)。
sed 's/検索パターン/置換文字列/g' ファイル名ファイル内の全てのマッチする検索パターン置換文字列に置換します。
sed -n 'p' ファイル名ファイルの内容を出力します(-nオプションは自動での出力を抑制し、pコマンドで明示的に出力を指示)。
sed '/検索パターン/d' ファイル名検索パターンにマッチする行を削除します。
sed -E 's/正規表現/置換文字列/g' ファイル名拡張正規表現を使用して、ファイル内の全てのマッチするパターンを置換文字列に置換します。
sed '1,5d' ファイル名ファイルから1行目から5行目までを削除します。
sed 's/検索パターン/置換文字列/2' ファイル名ファイル内で2番目にマッチした検索パターンのみを置換文字列に置換します。

【sed初級編】sedを使ってみよう

サンプルテキストファイルを用意しました。このファイルを使用して、sedコマンドの使用例をいくつか実行してみましょう。ファイルの内容は以下の通りです:

text
こんにちは、世界!
今日は良い天気ですね。
sedコマンドは強力です。
さようなら、世界!

文字列の置換

sedコマンドを使って、「世界」を「プログラマー」に置換してみます。

コマンド:

zsh
sed 's/世界/プログラマー/g' sample_text.txt

出力結果:

output
こんにちは、プログラマー!
今日は良い天気ですね。
sedコマンドは強力です。
さようなら、プログラマー!

行の削除

次に、「良い天気」を含む行を削除してみます。

コマンド:

zsh
sed '/良い天気/d' sample_text.txt

出力結果:

output
こんにちは、世界!
sedコマンドは強力です。
さようなら、世界!

ファイルの直接編集(インプレース編集)

ファイルを直接編集し、再度「世界」を「プログラマー」に置換しますが、今回はファイルを直接更新します。

コマンド:

zsh
sed -i '' 's/世界/プログラマー/g' sample_text.txt

ファイルの内容が以下の通り変更されました:

sample_text.txt
こんにちは、プログラマー!
今日は良い天気ですね。
sedコマンドは強力です。
さようなら、プログラマー!

【sed実践編】パイプで他のコマンドと組み合わせた

sedコマンドはテキスト処理の際に非常に強力で、他のコマンドと組み合わせてパイプ(|)で使用されることが多いです。ここでは、sedを他のコマンドと組み合わせた典型的な使用例をいくつか紹介します。

ファイルから特定の行を抽出し、その行を編集

grepコマンドで特定のパターンにマッチする行を抽出し、sedでその行を編集する場合があります。
zsh
grep '特定のパターン' ファイル名 | sed 's/検索パターン/置換文字列/g'

このコマンドは、ファイルから「特定のパターン」にマッチする行を見つけ出し、それらの行に含まれる「検索パターン」を「置換文字列」に置換します。

ログファイルから不要な情報を削除

ログファイルから特定のキーワードを含む行を除外したい場合に役立ちます。

zsh
cat ログファイル | sed '/不要なキーワード/d'

このコマンドは、ログファイルから「不要なキーワード」を含む行を削除して表示します。

ファイルの特定のセクションだけを表示

sedを使ってファイルの特定の範囲の行だけを抽出することもできます。
zsh
sed -n '10,20p' ファイル名

ただし、この操作をパイプで他のコマンドと組み合わせる場合は、抽出した行に対してさらに処理を加えたい場合に便利です。

複数の編集操作を組み合わせる

sedで複数の編集操作を一度に行うことができます。
zsh
echo "サンプルテキスト" | sed -e 's/サンプル/テスト/' -e 's/テキスト/データ/'

このコマンドは、「サンプル」を「テスト」に、そして「テキスト」を「データ」に置換します。

パイプライン内でのデータ加工

複雑なデータ加工の一環として、sedを使って一時的な修正を加えた後、さらにawksortなどのコマンドで処理を行うことがあります。

zsh
cat データファイル | sed 's/不要な部分//' | sort | uniq

この例では、まずsedを使って「不要な部分」を削除し、その後sortで並び替え、uniqで重複行を削除しています。

具体的に実行してみましょう。サンプルデータファイルを作成しました。このファイルは人名のリストを含み、各行には「名前:」という不要な部分が含まれています。ファイルの内容は以下の通りです:

sample_data.txt
名前:山田太郎
名前:鈴木一郎
名前:高橋花子
名前:山田太郎
名前:佐藤あきら
名前:鈴木一郎

このデータを使って、「cat データファイル | sed 's/不要な部分//' | sort | uniq」のコマンド例を実際に試してみます。目的は「名前:」を取り除き、名前をアルファベット順に並び替え、重複を削除することです。

実際のコマンドは以下のようになります:

zsh
cat sample_data.txt | sed 's/名前://g' | sort | uniq

このコマンドを実行すると、以下のような結果が得られます:

output
山田太郎
鈴木一郎
高橋花子
佐藤あきら

この結果から、各行から「名前:」が取り除かれ、名前がアルファベット順に並び替えられ、重複が削除されました。

日本語データのソート

まず、この日本語データを使って単純なソートを実行する場合、sortコマンドは以下のように使用します:

bash
sort fruit_data.txt

このコマンドは、データを辞書順にソートします。

フィールドを指定したソート

各行をカンマで区切られたフィールドとして扱い、特定のフィールド(この場合は数量)に基づいてソートを行います。sortコマンドでは-tオプションでフィールドの区切り文字を指定し、-kオプションでソートの基準となるフィールド番号を指定します。

数量に基づいてソートする場合のコマンドは以下の通りです:

bash
sort -t, -k2,2n fruit_data.txt

  • -t,はフィールドの区切り文字がカンマであることを指定します。
  • -k2,2nは2番目のフィールド(数量)に基づいて数値順にソートすることを指定します。

【sed現場編】nginxのログファイル解析

次の形でnginxのエラーログかあったとします。

log
2024/03/13 23:44:54 [error] 3062295#3062295: *10304 open() "/dir/path/.well-known/openid-configuration" failed (2: No such file or directory), client: 165.232.170.165, server: kitchen-note.fun, request: "GET /.well-known/openid-configuration HTTP/1.1", host: "kitchen-note.fun"

ホスト名とエラーでフィルタリングして、ファイル名だけを抽出する

bash
grep "host: \"kitchen-note.fun\"" /var/log/nginx/error.log.1 | grep "failed" | sed -E 's/.* open\(\) "([^"]+)".*/\1/g'

特定のディレクトリ名を除外して、ファイル名だけを抽出する

bash
grep -v ".well-known" /var/log/nginx/error.log.1 | sed -E 's/.* open\(\) "([^"]+)".*/\1/g' | uniq -c | sort 
grepコマンドの-vオプションを使うと、特定のパターンを含む行を除外できます。結果を出力する前に、uniq -cによって重複行をまとめ、カウントさせています。そしてsortコマンドで、重複の数が少ない順に並べ替えて出力します。

関連記事

最後までご覧いただきありがとうございます!

▼ 記事に関するご質問やお仕事のご相談は以下よりお願いいたします。
お問い合わせフォーム