使い方
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に渡す。
|
|
[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行目だけを取り出す例。
|
|
[vagrant@localhost systemd]$ ls -al | sed -n 2p drwxr-xr-x. 4 root root 151 2月 25 15:28 . |
開始番号と終了番号を指定することもできる。
sed -n 開始番号,終了番号p
4~6行目を取り出す例。
|
|
[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
最終行を取り出す例。
|
|
[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行を表示させている。
|
|
[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という文字列を含む行のみ抽出している。
|
|
[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に置換した行のみが表示される。
|
|
[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行目を取り除いている。
|
|
[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
以下の例では、通常ファイルの出力結果を除いている。
|
|
[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に置換している。
|
|
[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に置換している。
|
|
[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に置換している。
|
|
[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に置換する。
|
|
[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の結果から時刻の部分だけを取り除いている。
|
|
[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は通るが
|
|
[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は通らない
|
|
[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 |
{, }は\{, \}でエスケープ
エスケープしないと通らないが
|
|
[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 |
エスケープすると通る
|
|
[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 |