RAKUS Developers Blog | ラクス エンジニアブログ

株式会社ラクスのITエンジニアによる技術ブログです。

sed コマンド【使い方 まとめ】

アイキャッチ画像

はじめに

皆さん初めましてmonga3です。
今回はLinux上で文字列を処理することに便利なsedコマンドについて紹介していきます。
sedコマンドの基本から実務での使用方法を交えて説明します。

Linuxの理解をより深めたい方へ以下関連おすすめブログ
ls コマンド 【使い方 まとめ】
find コマンド 【使い方 まとめ】
sed コマンド【使い方 まとめ】
vi コマンド【使い方まとめ】
よく使うLinuxコマンド一覧【最新版】Linuxのファイル操作でよく使うLinuxコマンド
初心者のためのawkコマンド
実務で使える!基本的なシェル(Linux)コマンドの話 ~forとsed~
【Linux】今振り返りたい、プロセスって何?

目次

sed コマンドとは

  • 「stream editor」の略称で、指定したファイルをコマンドに従って処理することが出来る。
  • 入力を行単位で読み取り、テキスト変換などの編集をおこない行単位で出力する。
  • 正規表現に対応している。

使い方

sed [オプション] コマンド 入力ファイル名

コマンド

どういう処理をしたいかをコマンドで指定します。

処理内容の出力、削除、文字列の追加、置換などの処理を行えるコマンドが用意されています。

コマンド 説明
[=] 現在の行番号を出力します。
[#] コメント
[a 文字列] 指定した位置の後ろに文字列を追加します。(改行する場合は改行前の文字列に[/]を付ける。)
[i 文字列] 指定した位置の後ろにテキストを挿入します。(改行する場合は改行前の文字列に[/]を付ける。)
[c 文字列] 選択した行をテキストに置き換えます。(改行する場合は改行前の文字列に[/]を付ける。
[q] 入力を中断し、それ以上処理を行わず終了します。(※未出力分があれば出力してから終了します。)
[Q] 入力、出力をせずに終了します。
[d] 指定した行を削除します。
[l 文字数] 指定した文字数で改行します。
[p] 処理した内容を出力します。-n オプションと組み合わせて使うことがあります。
[P] 処理した内容を出力します。
[r ファイル名] ファイルを先頭に追加します。
[s/置換前文字列/置換後文字列/] (置換前文字列)で指定した文字列にマッチした部分を置換後文字列へ置き換えます。また複数マッチした場合は先頭のみ置換を行い、対象全て置換を行う場合は[s/置換前/置換後/g]のように[-g]オプションを併用します。
[y/元の文字列/対象文字列/] (元の文字列)のものを(対象文字列)の同じ位置に存在する文字列に置換します。(※[tr]コマンドのように使用可能です。)

オプション

コマンド実行時のオプションを指定できます。

オプション 説明
[-e(スクリプト)] スクリプトをコマンドに追加します。複数指定すれば、複数回のコマンドを実行できます。
[-E] 拡張正規表現を利用する時に使用します。
[-f(ファイル名)] スクリプトが記述されているファイルを指定します。ファイルに記載されているコマンドを実行することが出来ます。
[-i] 直接ファイルを編集します。
[-i(拡張子)] ファイルを直接編集して、指定した拡張子でバックアップを行います。
[-n] 出力コマンドのみ出力します。
[-l (文字数)] lコマンドの出力行を折り返す長さを指定します。
[-r] 拡張正規表現を利用する時に使用します。(Eと同じ)

アドレス

特定の行だけを処理したい場合は、コマンドの前に処理対象の位置を指定します。
これをアドレスといいます。アドレスは数字と「$」、正規表現が使用できます。
アドレスの後に「!」を付けると、アドレスで指定した意外という意味になります。

アドレス 説明
[数字] 行番号として認識されます。
[$] 最終行として認識されます。
[/正規表現/] 正規表現にマッチした行をコマンド処理します。
[開始行,終了行] 開始行から終了行を指定できます。
[開始行˜数字] 開始行から処理を開始して、数字で指定した間隔を処理の対象行とします。「10˜4」とした場合は10行目、14行目、18行目と4行間隔になります。
[アドレス,+数字] アドレスで指定した行の次から数字で指定した行を対象行として処理します。「/正規表現/,+4」正規表現にマッチする行から4行分が処理対象となります。

基本的な使い方

ここではsedコマンドの使い方を説明します。
コマンド、オプション、アドレスを組み合わせることで以下のテキスト編集が出来ます。
sample.txtというファイルをsedコマンドで編集するという想定で説明します。

  • 条件に一致した行で最初の箇所を置換する

小文字のrakusを大文字のRAKUSに置換します。

sed -e 's/rakus/RAKUS/' sample.txt
#例:sample.txt
1.rakus rakus
2.rakus

# 上記のsample.txtのファイルに対して、実行した場合下記のような結果を取得できます。
# 1行目の2つ目の「rakus」は変換されません。
1.RAKUS rakus
2.RAKUS
  • 条件に一致する全ての箇所を置換する

gを付けることで条件に一致する全て箇所の「rakus」を「RAKUS」に置換します。

sed -e 's/rakus/RAKUS/g' sample.txt
#例:sample.txt
1.rakus rakus
2.rakus

# 上記のsample.txtのファイルに対して、実行した場合下記のような結果を取得できます。
# 条件に一致する全て箇所の「rakus」が変換されます。
1.RAKUS RAKUS 
2.RAKUS
  • 空白(半角スペース)をタブに置換

編集したいファイルの空白(半角スペース)をすべて削除します。
「\t」は正規表現です。

sed -i "s/ /\t/g" sample.txt
  • 空白(半角スペース)を削除

編集したいファイルの空白(半角スペース)をすべて削除します。

sed -i "s/ //g" sample.txt
  • 空白行を削除

正規表現の「^$」と削除コマンドの「d」使用します。

sed  -i '/^$/d' sample.txt
  • 連続するスペースまたはタブをスペースに全て置換
sed -E 's/[\t ]+/ /g'
  • アドレスを指定して、指定行を削除

5行目を指定して削除します。

sed -e 5d
sed -n -e /正規表現/p
  • 行番号で範囲を指定して抽出

1行目から5行目を範囲指定しています。

sed -n -e 1,5p sample.txt
  • 行番号で範囲を指定して削除

1行目から5行目を範囲指定しています。

sed  -e '1,5d' sample.txt
  • 編集するファイルの指定方法

ファイル編集の方法は以下の3つあります。

# 指定した入力ファイルを直接編集します。
sed -i "s/ //g" sample.txt

# 入力ファイルを直接編集しないで、編集結果を別ファイルとして出力します。
# 入力ファイル名を「対象ファイル名 > 出力ファイル名」と指定します。
sed -e "s/ //g" sample.txt > sample_2.txt

# 実行結果
sample.txt   #こちらのファイルは編集されません。
sample2.txt #コマンド実行を指定したファイル名で作成します。

# バックアップファイルを作成して、指定したファイルを編集する。
# オプションの「-i」 の後ろに「.bak」を付けると、拡張子が「.bak」のバックアップファイルを作成してくれます。
sed -i.bak "s/ //g" sample.txt

# 実行結果
sample.txt #こちらのファイルを編集します。
sample.txt.bak #編集前のファイルのバックアップを作成します。

応用編

この応用編ではsedコマンドを他のコマンドと組み合わせて使用する方法を説明します。
他のコマンドを組み合わせることで、多様なテキストファイルの編集を行うことが出来ます。

  • ファイルを参照するcatコマンドを使用して、文字列を置換した部分の行のみ出力する
cat sample.properties | sed -n s/rakus/Rakus/p
find ./ -type f -name *.env | xargs sed -i -e '5s|http://localhost|http://localhost:8080|'
  • 置換したあとに、キーでソートする

「|」をタブに置換しています。
その後にsortコマンドで行をソートしています。
「 > sample_2.csv」とすることで、元ファイルを編集せずに結果を「sample_2.csv」として出力しています。

sed -e "s/|/\t/g" sample_1.csv | sort -t$'\t' -k 1 > sample_2.csv

Linuxコマンド おすすめ書籍

sed コマンド まとめ

今回はsedコマンドについて使い方をまとめました。
アドレス、コマンド、オプションと覚えることは複数あり大変ですが、テキストファイルの編集作業をやる時は手作業で1ファイルずつやるより、sedコマンドを使用した方が正確性が上がるので、機会があれば試してください。
他のコマンドと組み合わせることで、テキストファイルの編集、指定したキーでのソート、ファイルの結合などができるようになります。
これらの一連のコマンドをシェルスクリプトにすれば、さらに利便性が上がると思います。
手作業でファイル編集をやるには、少し大変と思った時にはsedコマンドでの編集を検討してみてください。

Linuxコマンドの一つ、awkコマンドについて以下の記事でまとめられているので、ぜひ参照してください。
初心者のためのawkコマンド - RAKUS Developers Blog | ラクス エンジニアブログ



◆TECH PLAY
techplay.jp

◆connpass
rakus.connpass.com

Copyright © RAKUS Co., Ltd. All rights reserved.