Linuxコマンド紹介-「sed」


この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので十分ご注意ください。

第三シスの趙(@realdapeng)です。
これからLinuxの世界でよく使われるコマンドを紹介しようと思います。

まずはsed、awk、grep コマンド:

  • sed:文字列を置換
  • awk:文字列を抽出
  • grep:文字列を検索

本日はsedです。
sedを使って文字列を全置換したり、行単位で抽出したり、削除したり、いろいろなテキスト処理のできるコマンド。

1.紹介

sedコマンドはLinux/Unix/BSD/OSXに標準で入っています。
「sed」は「ストリームエディタ」を意味する英語「stream editor」に由来です。

対話型テキストエディタと異なり、処理の経過・内容を逐次ユーザに確認することはない。非対話型であること、複数ファイルを一括して処理できることから、作業は対話型エディタによる逐次処理に比して極めて高速であり、生産性も高い。

2.特徴

sedは、入力を行単位で読み取り、sedスクリプトと呼ばれるシンプルな命令文に従ってテキスト変換などの編集をおこない、また行単位で出力する。基本的には照合ルールに従い場合分けをおこなうフィルタと捉えることができる。

3.正規表現

下記3種類のパーツを組み合わせて使います。

  • 文字を指定するパーツ:「A」「1」「.」など
  • 文字数を指定するパーツ:「*」「+」「{1,3}」など
  • 文字の位置を指定するパーツ:「^」「$」など
正規表現 意味
A 1 aなど 具体文字を指定
. 何らかの1文字
[AHZ] どれかの文字に一致する
[0-9] \d 何らかの半角数字
[a-z] 何らかの小文字の半角英字
[A-Z] 何らかの大文字の半角英字
[0-9a-zA-Z] \w 何らかの半角英数字
\s 改行文字を含んだ空白文字

4.基本文法

sed [オプション] スクリプトコマンド 入力ファイル

sed [オプション] 'command' filename

[オプション]のところ、よく使うのは -n、-e、-i、-f、-r  です。

オプション

  • -e 拡張正規表現を使う。基本正規表現と拡張正規表現を参照。
  • -i 標準出力せずにファイルを上書きで書き換える
  • -n 修理する各行の自動出力をしない。-p コマンドによる出力のみになる。
  • -r 拡張正規表現を使う。-e と同じ。
  • -u 出力をバッファリングしない。tail -fと組み合わせるときに有用。
  • –help ヘルプを表示
  • –version バージョンを表示

5.数字のマッチと正規表現のマッチ

A.数字のマッチ

# 4行目でhelloをAに置き換えるだけ
$ sed '4s/hello/A/g' file.txt

# 2〜4行目でhelloをAに置き換える
$ sed '2,4s/hello/A/g' file.txt

# 2行目から始めて、4行下、つまり2〜6行目をカウントダウン
$ sed '2,+4s/hello/A/g' file.txt

# 最後の行でhelloをAに置き換える
$ sed '$s/hello/A/g' file.txt

# 他の行ではhelloをAに置き換える
$ sed '1!s/hello/A/g' file.txt

B.正規表現のマッチ

# helloに一致する行で削除操作を実行する。dは削除を意味
$ sed '/hello/d' file.txt

# 空行を削除する。「^ $」は空白行を意味
$ sed '/^$/d' file.txt

# tsで始まる行からteで始まる行まで、すべての行を削除する
$ sed '/^ts/,/^te/d' file.txt

C.数字と正規表現合わせてマッチ

# 1行目からts先頭までの行まで、一致した行を削除する
$ sed '1,/^ts/d' file.txt

6.コマンド

sコマンド

基本文法
[address]s/pat/rep/flags

普通の例

# 各行でhelloをHELLOに置き換え、一致する最初の行のみを置き換える
$ sed 's/hello/HELLO/' file.txt
# 一致したすべてのhelloをHELLOに置き換える。gは、行内の一致したすべての行を置き換えること意味
$ sed 's/hello/HELLO/g' file.txt
# 2回目に一致するhelloを置き換える
$ sed 's/hello/A/2' file.txt
# 2回目以降はすべての一致を置き換える
$ sed 's/hello/A/2g' file.txt
# 行の先頭に#を追加する
$ sed 's/^/#/g' file.txt
# 行の最後に何かを追加する
$ sed 's/$/xxx/g' file.txt

正規表現の例

# 拡張正規表現を使用すると、結果は次のようになる
$ echo "hello 123 world" | sed -r 's/[a-z]+ [0-9]+ [a-z]+/A/'

# <b>これ</ b>は<spanstyle = "x">私</ span>の意味
# 要件:上記のhtmlファイルの<>を削除する
$ sed 's/<[^>]*>//g' file.txt

複数の例

# 1〜3行のmyをyourに置き換え、3行目以降のThisをThatに置き換え
$ sed '1,3s/my/your/g; 3,$s/This/That/g' my.txt
# 下記もOK
$ sed -e '1,3s/my/your/g' -e '3,$s/This/That/g' my.txt

aコマンド

dコマンドは行を追加する。

# すべて行の下にAの行を追加する
$ sed 'a A' file.txt
# ファイルの1〜2行目の下にコンテンツAの行を追加する
$ sed '1,2a A' file.txt

dコマンド

dコマンドは行を削除する。

# ファイル内の1〜3行を削除する
$ sed '1,3d' file.txt
# ファイル内のThisからの行を削除する
$ sed '/^This/d' file.txt

=コマンド

=行番号をつける

# 指定した行の上に行番号を表示する
$ sed '1,2=' file.txt
# 行頭に行番号を設定する
$ sed '=' file.txt | sed 'N;s/\n/\t/'

7.実践演習

1.ファイル各行の2番目の文字を削除する

$ sed -r 's/(.)(.)(.*)$/\1\3/' file.txt

2.各行1番目と2番目の文字を交換する

$ sed -r ‘s/(.)(.)(.*)/\2\1\3/’ file.txt

3.ファイル内すべての数字を削除する

$ sed 's/[0-9]//g' file.txt

4.ファイル内すべてのスペースをタブに置き換え

$ sed -r 's/ +/\t/g' file.txt

5.すべて大文字を括弧()で囲み

$ sed -r 's/([A-Z])/(\1)/g'

6.インターレース削除

$ sed '0~2{d}' file.txt

7.すべての空行を削除する

$ sed '/^$/d' file.txt

8.そのた

Windowsでもsed使いたいという人がいたので、ちょっと追記、以下のサイトからWindows用のバイナリを取得すれば、Windowsでもsedが使えます。WSLなどLinux環境を追加したくない、sedのコマンドだけほしい、PowerShellやプロンプトで使えればいいだけという人にお勧めです。

sed for Windows Site

Last modified: 2024-02-06

Author