Espress
2021 December 4th

【Linux】sedコマンドの基本的な使い方をまとめてみました

sedコマンドの基本的なコマンド説明&例を、実行結果と一緒にできる限りわかりやすくまとめてみました。

profile icon
written by スズキ ハルヤ
article image

sedコマンドについて

文字列の置換や抽出、削除など多くのテキスト処理ができるコマンドです。
ちなみにsedは「Stream EDitor」の略です。

sedコマンドについては、Linux(GNU系)かmacOS(BSD系)かで処理が変わってくるので、その内容についても触れながら紹介していきます。

参照ファイルの準備

まずは、参照元のテキストファイルを作成します。

// test.txt
AAAA AAAA
BBBB BBBB
CCCC CCCC
DDDD DDDD
AAAA AAAA

続いてsedコマンドを記述していきます。

出力処理

出力結果の行数を指定して表示

eオプションはsedの第一引数(下記コードの[指定行1],[指定行2]p)がコマンド、第二引数以降(下記コードの[ファイル名])は入力ファイルと指定するものです。

eオプションを省略した場合にも、第一引数がコマンド、第二引数以降は入力ファイルと処理するため、省略も可能です。
※当コマンド以降、全てeオプションを省略しています。

nオプションは指定しなかった余分な行の文字列を表示しないようにするものです。

// sed -e -n [指定行1],[指定行2]p [ファイル名]
sed -e -n 2,3p test.txt
実行結果

test.txtの2~3行までの内容を表示します。

BBBB BBBB
CCCC CCCC

特定の行を消して表示

// sed [削除する行]d [ファイル名]
sed 1d test.txt
実行結果

1番目の行を削除して表示します。

BBBB BBBB
CCCC CCCC
DDDD DDDD
AAAA AAAA

ファイル内にある対象の文字列を他の文字列に置換する

sは正規表現で置換処理をするという意味になります。

// sed 's/[対象文字列]/[置き換える文字列]/' [ファイル名]
sed 's/AAAA/ZZZZ/' test.txt
実行結果

AAAAがZZZZに置換されます。
ただし実行結果の通り、各行でマッチした対象文字列の1つ目のみにしか置換をしません。

ちなみに実行しても置換されたデータが表示されるだけで、ファイルデータは変わりません。

ZZZZ AAAA
BBBB BBBB
CCCC CCCC
DDDD DDDD
ZZZZ AAAA

ファイル内にある対象の文字列全てを他の文字列に置換する

もし、各行でマッチした対象文字列 全てに対して置換をしたい場合には先ほどのコードにgコマンドを使用すれば可能です。
※ gの後にスラッシュは不要なので注意が必要です。

// sed 's/[対象文字列]/[置き換える文字列]/g' [ファイル名]
sed 's/AAAA/ZZZZ/g' test.txt
実行結果
ZZZZ ZZZZ
BBBB BBBB
CCCC CCCC
DDDD DDDD
ZZZZ ZZZZ

各行のn番目の対象文字列に対してのみ他の文字列に置換する

// sed 's/[対象文字列]/[置き換える文字列]/[n]' [ファイル名]
sed 's/AAAA/ZZZZ/2' test.txt
実行結果
AAAA ZZZZ
BBBB BBBB
CCCC CCCC
DDDD DDDD
AAAA ZZZZ

行番号を指定して対象の文字列を他の文字列に置換する

// sed '[行番号1],[行番号2]s/[対象文字列]/[置き換える文字列]/' [ファイル名]
sed '2,5s/AAAA/ZZZZ/' test.txt
実行結果
AAAA AAAA
BBBB BBBB
CCCC CCCC
DDDD DDDD
ZZZZ AAAA

ファイルの上書き処理

上記では置換したデータを表示するだけですが、今度は実際にファイルを上書きしてみましょう。
ファイルに変更を加える場合には、iオプションを使用します。

下記のコマンドはLinux(GNU系)のsedとmacOS(BSD系)のsedではコマンドに差異があるため、ご使用のOS(sed)に応じてご使用ください。
詳しくは下記の記事をご覧ください。
【Linux】MacOSのsedコマンドでエラーが発生した時の対処法

出力結果の行数を指定して上書き

Linux(GNU系)

// sed -i 's/[対象文字列]/[置き換える文字列]/g' [ファイル名]
sed -i 's/AAAA/ZZZZ/g' test.txt

macOS(BSD系)

// sed -i '' 's/[対象文字列]/[置き換える文字列]/g' [ファイル名]
sed -i '' 's/AAAA/ZZZZ/g' test.txt
実行後のファイル
ZZZZ ZZZZ
BBBB BBBB
CCCC CCCC
DDDD DDDD
ZZZZ ZZZZ

ファイル内にある空白を削除して上書き

Linux(GNU系)

// sed -i 's/[スペース]//g' [ファイル名]
sed -i 's/ //g' test.txt

macOS(BSD系)

// sed -i '' 's/[スペース]//g' [ファイル名]
sed -i '' 's/ //g' test.txt
実行後のファイル
AAAAAAAA
BBBBBBBB
CCCCCCCC
DDDDDDDD
AAAAAAAA

ファイルの中身を全て削除

Linux(GNU系)

// sed -i 'd' [ファイル名]
sed -i 'd' test.txt

macOS(BSD系)

// sed -i '' 'd' [ファイル名]
sed -i '' 'd' test.txt
実行後のファイル

おわりに

いかがだったでしょうか。
数多くあるLinuxコマンドの中でも、使われることの多いsedコマンド。
他にもawkなどの便利なコマンドがたくさんあるので、興味のある方はぜひ調べてみてください!

最後までご覧いただき、ありがとうございました。

introduction image

- Introduction -

Espressの成り立ちとデジタルクリエイティブにおける想い

introduction image

多くの情報が乱立する中、Espressは記事を読んでくださる皆様に、より良い情報と価値のあるコンテンツをお届けしたいと考えています。また、企業や事業主が掲げる目標達成の手助けをサイト利用者の利便性を捉え、ブランドと読者のより良い結びつきを作ります。

詳しくみる