Linuxコマンド - sed

提供:MochiuWiki : SUSE, EC, PCB
2020年11月28日 (土) 00:50時点におけるWiki (トーク | 投稿記録)による版 (→‎使用例)
ナビゲーションに移動 検索に移動

概要

sedコマンドとは、与えられた文字列をルールに従って変換するコマンドである。
例えば、文字列の置換や行の削除といった処理が行う。

変換に利用できるルールにおいて、下表のような条件式が利用できる。
例えば、文字列を挿入したい場合は、aiの後に挿入する文字列を指定する。
文字列を置換したい場合は、s/置換ルール/置換文字/と実行する。

置換ルールの最初に数値を指定すると、指定した行のみが処理される。
例えば、3dと指定すると、3行目が削除される。

sedコマンドで実際に変換を行う場合は、変換処理内容は-eオプションを指定した後に記述する。
また、sedコマンドに指定したファイルの内容を処理する。
例えば、test.txt内にある"Linux"を"リナックス"に置換する場合は、次のように実行する。

sed -e "s/Linux/リナックス/g" test.txt 


結果は標準出力に表示される。
もし、ファイルに保存する場合はリダイレクトを利用する。

また、-fオプションで変換手順を記載したスクリプトファイルを指定できる。その時、指定したファイルの内容に従って処理される。


構文

sed <オプション> <対象ファイル>


オプション 説明
-e <スクリプト名> 指定したスクリプト(条件式)で変換処理を行う。
-f <ファイル名> 指定したファイルに記述されているコマンドやスクリプトに従って処理を行う。
r 指定したファイルに記述されているコマンドやスクリプトに従って処理を行う。



パターン・スペースとホールド・スペース

sedコマンドでは、処理を行う対象の文字列を一時的に保存しておく必要がある。
この保存スペースのことをパターン・スペースと呼ぶ。
例えば、1行目を処理する時には、1行目の内容がパターン・スペースに保存される。その後、パターン・スペースにある文字列に対して置換などの処理が行われる。

ホールド・スペースとは、パターン・スペースのサブとして使われる保存領域である。
例えば、パターン・スペースにある文字列を後の処理で利用する場合等は、一度ホールド・スペースに移動しておく。
他の処理を行った後に、ホールド・スペースからパターン・スペースに戻せば、以前の処理の続きが行うことができる。

パターン・スペースの文字列をホールド・スペースにコピーする場合はh
ホールド・スペースの文字列をパターン・スペースにコピーする場合はg
パターン・スペースとホールド・スペースを入れ替える場合はxを実行すればよい。


sedコマンドの条件式

条件式 説明
行数 処理する行数を指定する
行数,行数 指定した行数間の文字列を処理する。
$を指定すると最後の行を表せる。
/文字列/ 指定した文字列が現れる行を処理する。
先頭に^を付けると、指定した文字列から始まる行、末尾に$を付けると指定した文字列で終わる行が対象になる。
行数の範囲指定でも利用できる。
:ラベル bおよびtコマンド用のラベル
#コメント コメント
{..} 括弧内をブロックとして扱う。
= 現在の行番号を表示する。
a <文字列> 文字列を追加する。ただし、改行をする場合は、直前に\を付ける。
i <文字列> 文字列を挿入する。ただし、改行をする場合は、直前に\を付ける。
q 処理を中断して、sedコマンドを終了する。
r <ファイル名> 指定したファイルを読み出して追加する。
b <ラベル> 指定したラベルに移動する。
t <ラベル> s///が成功した場合、指定したラベルに移動する。
c <文字列> 選択している行を文字列に置換する。ただし、改行をする場合は、直前に\を付ける。
d パターン・スペースを削除する。
D パターン・スペース内の最初の改行までを削除する。
h パターン・スペースをホールド・スペースにコピーする。
H パターン・スペースをホールド・スペースに追加する。
g ホールド・スペースをパターン・スペースにコピーする。
G ホールド・スペースをパターン・スペースに追加する。
x ホールド・スペースとパターン・スペースを入れ替える。
n 次の行をパターン・スペースに読み込む。
N 次の行をパターン・スペースに追加する。
p 現在のパターン・スペースを表示する。
P 現在のパターン・スペースの最初に現われる改行までを表示する。
w <ファイル名> 現在のパターン・スペースを指定したファイルに書き込む。
s/置換条件/置換文字/ 置換条件を置換文字に変換する。
最後にgを付けた場合は、置換条件に当てはまる全ての文字列が置換される。
y/変換対象の文字/変換文字/ 変換対象の文字を変換文字に変換する。



使用例

テキストファイルの5~10行目を削除する。

sed -e "5,10d" test.txt 


テキストファイル内の"Nikkei Linux"を"日経Linux"に変換する。

sed -e "s/Nikkei Linux/日経Linux/g" test.txt 


"Error"という文字列がある行に対して、"### Check Line ###"という新しい行を追加する。

sed -e "/Error/i #### Check Line ###" test.txt



正規表現

sedコマンドは、多くの正規表現を使用することができる。
ただし、sedコマンドの正規表現の記述方法は、他のプログラム言語の正規表現はやや異なっているので注意する。

下表に、sedコマンドで使用できる正規表現を示す。
併せて、grepコマンドとawkコマンドの正規表現も記載する。

grep sed awk 意味
. . . 任意の1文字
* * * 直前の1文字または1パターンの0回以上の繰り返し
^ ^ ^ 行の先頭
$ $ $ 行の末尾
\( \) \( \) () パターンのグループ化
\1 \2 \3 \1 \2 \3 後方参照
[ ] [ ] [ ] 括弧内の任意の1文字
\{n\} \{n\} {n} 直前の1文字または1パターンのn回の繰り返し
\{n, \} \{n, \} {n, } 直前の1文字または1パターンのn回以上の繰り返し
\{n, m\} \{n, m\} {n, m} 直前の1文字または1パターンのn回以上かつm回以下の繰り返し
\+ \+ + 直前の1文字あるいは1パターンの1回以上の繰り返し
\? ? 直前の1文字あるいは1パターンの0回または1回だけ出現
\| \| | 2 パターンのうちどちら片方