Linux – sed

使い方

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に渡す。

行抽出

以下の指定は、アドレスかパターンで指定された行を表示する。

sed [アドレスorパターン]p

ただしpコマンドは処理された行以外の行も表示されるため、-nオプションで処理された行のみ表示させる。

行番号指定

行抽出は-nオプションを付け、-n 行番号pとする。

sed -n 行番号p

2行目だけを取り出す例。

開始番号と終了番号を指定することもできる。

sed -n 開始番号,終了番号p

4~6行目を取り出す例。

最終行のみを指定する場合は$pとする。この場合はシェルが認識しないよう、$をエスケープするかスクリプト部分をシングルクォートで囲む。

sed -n '$p' または sed -n \$p

最終行を取り出す例。

ただし「最後からn行」といった指定はsedではできないため、tailコマンドを使う。

tail -n 行数

以下の例はlsコマンドの最後3行を表示させている。

-n 行数を指定せずtailだけにすると、デフォルトの10行となる。

パターン指定

/パターン/pでマッチしたパターンの行が対象となる。これに-nオプションを付けて、パターンにマッチした行のみ抽出する。

sed -n /パターン/p

以下はrwxという文字列を含む行のみ抽出している。

置換行のみ抽出

後述の文字置換・文字列置換された行のみを抽出する。

sed -n [y/s]/.../.../gp

以下の例では、rwxRWXに置換した行のみが表示される。

行削除

以下はアドレスやパターンにマッチする行を削除する。

sed [アドレスorパターン]d

行番号指定

sed 行番号dで指定した行を、sed 開始番号,終了番号dで指定した範囲の行を削除する。

以下の例ではls -alの結果から1~3行目を取り除いている。

パターン指定

/パターン/dでマッチするパターンを含む行を削除する。

sed /パターン/d

以下の例では、通常ファイルの出力結果を除いている。

文字置換

1文字置換

sed y/a/A/で、各行の文字aを全てAに置換する。

以下の例では、lsの結果中rの文字をRに置換している。

複数文字置換

sed y/abc/ABC/で、各行のaAに、bBに、cCに置換する。置換前の文字数と置換後の文字数は同じでなければならない。

以下の例では、lsの結果中rwxの文字をそれぞれRWXに置換している。

文字列置換

各行1つだけ置換

sed s/string/STRING/で、各行の最初に現れたstringSTRINGに置換する。

以下の例では各行最初のrootROOTに置換している。

全て置換

sed s/string/STRING/gと末尾にgを付けることで、各行の全てのstringSTRINGに置換する。

パターン削除

文字列置換の後半を//で空にすると、パターンにマッチした部分が削除される。

sed s/パターン//[g]

以下の例では、ls -alの結果から時刻の部分だけを取り除いている。

sedの正規表現の注意点

\wは使えるが\dは使えない

\wは通るが

\dは通らない

{, }\{, \}でエスケープ

エスケープしないと通らないが

エスケープすると通る

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です