使い方
sed [オプション] スクリプト [ファイル]
- オプションは必要に応じて指定する
- ファイルは入力ファイルがある場合に指定する
出力結果の加工
たとえばls
の結果を加工したいような場合、パイプでsed
に渡す。
コマンド | sed ...
その結果をファイルに書きだしたい場合はリダイレクト。
コマンド | sed ... > ファイルパス
ファイルの加工
ファイルを入力としてsed
で加工したい場合、置換などの表現の後にファイルを指定するか、ファイル出力をパイプでsed
に渡す。
sed ... ファイル
cat ファイル | sed ...
ファイル書き換えは-i
オプション
同じファイルを置換結果などで書き込む場合、リダイレクトを使うとファイルの内容が空になってしまう。
sed ... ファイル > ファイル
同じファイルの内容を書き換えるには-i
オプションを指定する。
sed -i sed ... ファイル
異なるファイルに書き込む場合にはリダイレクトを使ってよい。
sed ... ファイル > 別のファイル
スクリプトの区切り文字は任意
たとえば置換スクリプトs/.../.../g
などの区切り文字は、必ずしも/
である必要はない。
s1...1...1g
などスクリプトの内容に表れない任意の文字を使える。
'
か"
で囲む意味
次のような場合はスクリプトをシングルクォート('
)かダブルクォート("
)で囲む。
- 置換表現などにスペースを含む場合
$
などシェルに解釈される文字を含む場合
シングルクォートで囲むと、シェルによる解釈は行われず単なる文字列として扱われ、sed
のスクリプトとして解釈される。以下の表現では、sedが$を最終行のアドレスとして扱い、ファイルの最後の1行のみが表示される。
sed -n '$p' ファイル
ダブルクォートで囲むと、シェルの変数($...)
などの意味を持つものは処理される(変数が展開されるなど)。たとえば以下の表現はシェル変数$pと解釈され、それが定義されていなければ何も表示されない。
sed -n "$p" ファイル
シェルに解釈される文字を無効化するのには、シングルクォートで囲むほか、その文字をバックスラッシュでエスケープする方法もある。
sed -n \$p ファイル
スクリプト
例として以下のようなls
コマンドの結果をパイプでsed
に渡す。
1 2 3 4 5 6 7 8 9 10 11 12 |
[vagrant@localhost systemd]$ ls -al 合計 40 drwxr-xr-x. 4 root root 151 2月 25 15:28 . drwxr-xr-x. 82 root root 8192 6月 27 06:35 .. -rw-r--r--. 1 root root 720 2月 3 01:34 bootchart.conf -rw-r--r--. 1 root root 615 2月 3 01:34 coredump.conf -rw-r--r--. 1 root root 983 2月 3 01:34 journald.conf -rw-r--r--. 1 root root 957 2月 3 01:34 logind.conf drwxr-xr-x. 13 root root 4096 2月 3 01:34 system -rw-r--r--. 1 root root 1552 2月 3 01:34 system.conf drwxr-xr-x. 2 root root 6 2月 3 01:34 user -rw-r--r--. 1 root root 1127 2月 3 01:34 user.conf |
行抽出
以下の指定は、アドレスかパターンで指定された行を表示する。
sed [アドレスorパターン]p
ただしp
コマンドは処理された行以外の行も表示されるため、-n
オプションで処理された行のみ表示させる。
行番号指定
行抽出は-n
オプションを付け、-n 行番号p
とする。
sed -n 行番号p
2行目だけを取り出す例。
1 2 |
[vagrant@localhost systemd]$ ls -al | sed -n 2p drwxr-xr-x. 4 root root 151 2月 25 15:28 . |
開始番号と終了番号を指定することもできる。
sed -n 開始番号,終了番号p
4~6行目を取り出す例。
1 2 3 4 |
[vagrant@localhost systemd]$ ls -al | sed -n 4,6p -rw-r--r--. 1 root root 720 2月 3 01:34 bootchart.conf -rw-r--r--. 1 root root 615 2月 3 01:34 coredump.conf -rw-r--r--. 1 root root 983 2月 3 01:34 journald.conf |
最終行のみを指定する場合は$p
とする。この場合はシェルが認識しないよう、$
をエスケープするかスクリプト部分をシングルクォートで囲む。
sed -n '$p'
または sed -n \$p
最終行を取り出す例。
1 2 |
[vagrant@localhost systemd]$ ls -al | sed -n '$p' -rw-r--r--. 1 root root 1127 2月 3 01:34 user.conf |
ただし「最後からn行」といった指定はsed
ではできないため、tail
コマンドを使う。
tail -n 行数
以下の例はlsコマンドの最後3行を表示させている。
1 2 3 4 |
[vagrant@localhost systemd]$ ls -al | tail -n 3 -rw-r--r--. 1 root root 1552 2月 3 01:34 system.conf drwxr-xr-x. 2 root root 6 2月 3 01:34 user -rw-r--r--. 1 root root 1127 2月 3 01:34 user.conf |
-n 行数
を指定せずtail
だけにすると、デフォルトの10行となる。
パターン指定
/パターン/p
でマッチしたパターンの行が対象となる。これに-n
オプションを付けて、パターンにマッチした行のみ抽出する。
sed -n /パターン/p
以下はrwx
という文字列を含む行のみ抽出している。
1 2 3 4 5 |
[vagrant@localhost systemd]$ ls -al | sed -n /rwx/p drwxr-xr-x. 4 root root 151 2月 25 15:28 . drwxr-xr-x. 82 root root 8192 6月 27 15:42 .. drwxr-xr-x. 13 root root 4096 2月 3 01:34 system drwxr-xr-x. 2 root root 6 2月 3 01:34 user |
置換行のみ抽出
後述の文字置換・文字列置換された行のみを抽出する。
sed -n [y/s]/.../.../gp
以下の例では、rwx
をRWX
に置換した行のみが表示される。
1 2 3 4 5 |
[vagrant@localhost systemd]$ ls -al | sed -n s/rwx/RWX/gp dRWXr-xr-x. 4 root root 151 2月 25 15:28 . dRWXr-xr-x. 82 root root 8192 6月 27 15:42 .. dRWXr-xr-x. 13 root root 4096 2月 3 01:34 system dRWXr-xr-x. 2 root root 6 2月 3 01:34 user |
行削除
以下はアドレスやパターンにマッチする行を削除する。
sed [アドレスorパターン]d
行番号指定
sed 行番号d
で指定した行を、sed 開始番号,終了番号d
で指定した範囲の行を削除する。
以下の例ではls -al
の結果から1~3行目を取り除いている。
1 2 3 4 5 6 7 8 9 |
[vagrant@localhost systemd]$ ls -al | sed 1,3d -rw-r--r--. 1 root root 720 2月 3 01:34 bootchart.conf -rw-r--r--. 1 root root 615 2月 3 01:34 coredump.conf -rw-r--r--. 1 root root 983 2月 3 01:34 journald.conf -rw-r--r--. 1 root root 957 2月 3 01:34 logind.conf drwxr-xr-x. 13 root root 4096 2月 3 01:34 system -rw-r--r--. 1 root root 1552 2月 3 01:34 system.conf drwxr-xr-x. 2 root root 6 2月 3 01:34 user -rw-r--r--. 1 root root 1127 2月 3 01:34 user.conf |
パターン指定
/パターン/d
でマッチするパターンを含む行を削除する。
sed /パターン/d
以下の例では、通常ファイルの出力結果を除いている。
1 2 3 4 5 6 |
[vagrant@localhost systemd]$ ls -al | sed '/^-/d' 合計 40 drwxr-xr-x. 4 root root 151 2月 25 15:28 . drwxr-xr-x. 82 root root 8192 6月 27 15:42 .. drwxr-xr-x. 13 root root 4096 2月 3 01:34 system drwxr-xr-x. 2 root root 6 2月 3 01:34 user |
文字置換
1文字置換
sed y/a/A/
で、各行の文字a
を全てA
に置換する。
以下の例では、lsの結果中rの文字をRに置換している。
1 2 3 4 5 6 7 8 9 10 11 12 |
[vagrant@localhost systemd]$ ls -al | sed y/r/R/ 合計 40 dRwxR-xR-x. 4 Root Root 151 2月 25 15:28 . dRwxR-xR-x. 82 Root Root 8192 6月 27 06:35 .. -Rw-R--R--. 1 Root Root 720 2月 3 01:34 bootchaRt.conf -Rw-R--R--. 1 Root Root 615 2月 3 01:34 coRedump.conf -Rw-R--R--. 1 Root Root 983 2月 3 01:34 jouRnald.conf -Rw-R--R--. 1 Root Root 957 2月 3 01:34 logind.conf dRwxR-xR-x. 13 Root Root 4096 2月 3 01:34 system -Rw-R--R--. 1 Root Root 1552 2月 3 01:34 system.conf dRwxR-xR-x. 2 Root Root 6 2月 3 01:34 useR -Rw-R--R--. 1 Root Root 1127 2月 3 01:34 useR.conf |
複数文字置換
sed y/abc/ABC/
で、各行のa
をA
に、b
をB
に、c
をC
に置換する。置換前の文字数と置換後の文字数は同じでなければならない。
以下の例では、ls
の結果中r
、 w
、x
の文字をそれぞれR
、W
、X
に置換している。
1 2 3 4 5 6 7 8 9 10 11 12 |
[vagrant@localhost systemd]$ ls -al | sed y/rwx/RWX/ 合計 40 dRWXR-XR-X. 4 Root Root 151 2月 25 15:28 . dRWXR-XR-X. 82 Root Root 8192 6月 27 06:35 .. -RW-R--R--. 1 Root Root 720 2月 3 01:34 bootchaRt.conf -RW-R--R--. 1 Root Root 615 2月 3 01:34 coRedump.conf -RW-R--R--. 1 Root Root 983 2月 3 01:34 jouRnald.conf -RW-R--R--. 1 Root Root 957 2月 3 01:34 logind.conf dRWXR-XR-X. 13 Root Root 4096 2月 3 01:34 system -RW-R--R--. 1 Root Root 1552 2月 3 01:34 system.conf dRWXR-XR-X. 2 Root Root 6 2月 3 01:34 useR -RW-R--R--. 1 Root Root 1127 2月 3 01:34 useR.conf |
文字列置換
各行1つだけ置換
sed s/string/STRING/
で、各行の最初に現れたstring
をSTRING
に置換する。
以下の例では各行最初のroot
をROOT
に置換している。
1 2 3 4 5 6 7 8 9 10 11 12 |
[vagrant@localhost systemd]$ ls -al | sed s/root/ROOT/ 合計 40 drwxr-xr-x. 4 ROOT root 151 2月 25 15:28 . drwxr-xr-x. 82 ROOT root 8192 6月 27 06:35 .. -rw-r--r--. 1 ROOT root 720 2月 3 01:34 bootchart.conf -rw-r--r--. 1 ROOT root 615 2月 3 01:34 coredump.conf -rw-r--r--. 1 ROOT root 983 2月 3 01:34 journald.conf -rw-r--r--. 1 ROOT root 957 2月 3 01:34 logind.conf drwxr-xr-x. 13 ROOT root 4096 2月 3 01:34 system -rw-r--r--. 1 ROOT root 1552 2月 3 01:34 system.conf drwxr-xr-x. 2 ROOT root 6 2月 3 01:34 user -rw-r--r--. 1 ROOT root 1127 2月 3 01:34 user.conf |
全て置換
sed s/string/STRING/g
と末尾にg
を付けることで、各行の全てのstring
をSTRING
に置換する。
1 2 3 4 5 6 7 8 9 10 11 12 |
[vagrant@localhost systemd]$ ls -al | sed s/root/ROOT/g 合計 40 drwxr-xr-x. 4 ROOT ROOT 151 2月 25 15:28 . drwxr-xr-x. 82 ROOT ROOT 8192 6月 27 06:35 .. -rw-r--r--. 1 ROOT ROOT 720 2月 3 01:34 bootchart.conf -rw-r--r--. 1 ROOT ROOT 615 2月 3 01:34 coredump.conf -rw-r--r--. 1 ROOT ROOT 983 2月 3 01:34 journald.conf -rw-r--r--. 1 ROOT ROOT 957 2月 3 01:34 logind.conf drwxr-xr-x. 13 ROOT ROOT 4096 2月 3 01:34 system -rw-r--r--. 1 ROOT ROOT 1552 2月 3 01:34 system.conf drwxr-xr-x. 2 ROOT ROOT 6 2月 3 01:34 user -rw-r--r--. 1 ROOT ROOT 1127 2月 3 01:34 user.conf |
パターン削除
文字列置換の後半を//
で空にすると、パターンにマッチした部分が削除される。
sed s/パターン//[g]
以下の例では、ls -alの結果から時刻の部分だけを取り除いている。
1 2 3 4 5 6 7 8 9 10 11 12 |
[vagrant@localhost systemd]$ ls -al | sed 's/ [0-9][0-9]:[0-9][0-9]//' 合計 40 drwxr-xr-x. 4 root root 151 2月 25 . drwxr-xr-x. 82 root root 8192 6月 27 .. -rw-r--r--. 1 root root 720 2月 3 bootchart.conf -rw-r--r--. 1 root root 615 2月 3 coredump.conf -rw-r--r--. 1 root root 983 2月 3 journald.conf -rw-r--r--. 1 root root 957 2月 3 logind.conf drwxr-xr-x. 13 root root 4096 2月 3 system -rw-r--r--. 1 root root 1552 2月 3 system.conf drwxr-xr-x. 2 root root 6 2月 3 user -rw-r--r--. 1 root root 1127 2月 3 user.conf |
sedの正規表現の注意点
\w
は使えるが\d
は使えない
\w
は通るが
1 2 3 4 5 6 7 8 9 10 11 12 |
[vagrant@localhost systemd]$ ls -al | sed 's/\w\w:\w\w/**:**/g' 合計 40 drwxr-xr-x. 4 root root 151 2月 25 **:** . drwxr-xr-x. 82 root root 8192 6月 27 **:** .. -rw-r--r--. 1 root root 720 2月 3 **:** bootchart.conf -rw-r--r--. 1 root root 615 2月 3 **:** coredump.conf -rw-r--r--. 1 root root 983 2月 3 **:** journald.conf -rw-r--r--. 1 root root 957 2月 3 **:** logind.conf drwxr-xr-x. 13 root root 4096 2月 3 **:** system -rw-r--r--. 1 root root 1552 2月 3 **:** system.conf drwxr-xr-x. 2 root root 6 2月 3 **:** user -rw-r--r--. 1 root root 1127 2月 3 **:** user.conf |
\d
は通らない
1 2 3 4 5 6 7 8 9 10 11 12 |
[vagrant@localhost systemd]$ ls -al | sed 's/\d\d:\d\d/**:**/g' 合計 40 drwxr-xr-x. 4 root root 151 2月 25 15:28 . drwxr-xr-x. 82 root root 8192 6月 27 15:42 .. -rw-r--r--. 1 root root 720 2月 3 01:34 bootchart.conf -rw-r--r--. 1 root root 615 2月 3 01:34 coredump.conf -rw-r--r--. 1 root root 983 2月 3 01:34 journald.conf -rw-r--r--. 1 root root 957 2月 3 01:34 logind.conf drwxr-xr-x. 13 root root 4096 2月 3 01:34 system -rw-r--r--. 1 root root 1552 2月 3 01:34 system.conf drwxr-xr-x. 2 root root 6 2月 3 01:34 user -rw-r--r--. 1 root root 1127 2月 3 01:34 user.conf |
{, }
は\{, \}
でエスケープ
エスケープしないと通らないが
1 2 3 4 5 6 7 8 9 10 11 12 |
[vagrant@localhost systemd]$ ls -al | sed 's/[0-9]{2}:[0-9]{2}/**:**/g' 合計 40 drwxr-xr-x. 4 root root 151 2月 25 15:28 . drwxr-xr-x. 82 root root 8192 6月 27 15:42 .. -rw-r--r--. 1 root root 720 2月 3 01:34 bootchart.conf -rw-r--r--. 1 root root 615 2月 3 01:34 coredump.conf -rw-r--r--. 1 root root 983 2月 3 01:34 journald.conf -rw-r--r--. 1 root root 957 2月 3 01:34 logind.conf drwxr-xr-x. 13 root root 4096 2月 3 01:34 system -rw-r--r--. 1 root root 1552 2月 3 01:34 system.conf drwxr-xr-x. 2 root root 6 2月 3 01:34 user -rw-r--r--. 1 root root 1127 2月 3 01:34 user.conf |
エスケープすると通る
1 2 3 4 5 6 7 8 9 10 11 12 |
[vagrant@localhost systemd]$ ls -al | sed 's/[0-9]\{2\}:[0-9]\{2\}/**:**/g' 合計 40 drwxr-xr-x. 4 root root 151 2月 25 **:** . drwxr-xr-x. 82 root root 8192 6月 27 **:** .. -rw-r--r--. 1 root root 720 2月 3 **:** bootchart.conf -rw-r--r--. 1 root root 615 2月 3 **:** coredump.conf -rw-r--r--. 1 root root 983 2月 3 **:** journald.conf -rw-r--r--. 1 root root 957 2月 3 **:** logind.conf drwxr-xr-x. 13 root root 4096 2月 3 **:** system -rw-r--r--. 1 root root 1552 2月 3 **:** system.conf drwxr-xr-x. 2 root root 6 2月 3 **:** user -rw-r--r--. 1 root root 1127 2月 3 **:** user.conf |