書式 | 例 | 意味 |
---|---|---|
/正規表現/ | /abc/ | 「abc」を含む行。 |
\%正規表現% | \%^/home/% | 「/home/」から始まる行。表現に/ が含まれるなどの場合、この書式が見やすい。%の部分は任意の文字にできる。
|
行番号,/正規表現/ | 3,/abc/ | 3行目から「abc」を含む行まで。 |
/正規表現/,+行数 | /abc/,+5 | 「abc」を含む行から次の5行まで。 |
/正規表現/,/正規表現/ | /abc/,/efg/ | 「abc」を含む行から「efg」を含む行まで、全体を通して複数あればそれぞれマッチ。 |
ここではアドレスを2個まで指定できるdコマンド(マッチした行について、パターンスペースを削除)を例にする。
下記は「ジュース」を含む行にマッチし、それをd
コマンドで削除する。
input='りんごジュース 100円
みかんジュース 200円
いちごケーキ 300円'
echo "$input" | sed '/ジュース/ d'
いちごケーキ 300円
入力文字に/
が入っている場合で正規表現の区切りを/
から別の記号に変更する例。
下記は「/home/」から始まる行にマッチし、それをd
コマンドで削除する。マーク部分が正規表現の区切り。
input='/home/alice/temp
/root/temp
/home/john/local'
echo "$input" | sed '\%^/home/% d'
/root/temp
# これらも同じ
echo "$input" | sed '\#^/home/# d'
/root/temp
# 本来の書式のまま、入力側のスラッシュをエスケープして\/としてもいい
echo "$input" | sed '/^\/home\// d'
/root/temp
行指定,正規表現
という書式で、「指定行から正規表現にマッチするまで」という行範囲に対してコマンドを適用できる。
input='りんごジュース 100円
みかんジュース 200円
いちごケーキ 300円
チョコケーキ 400円'
# 2行目から最初の「ケーキ」にマッチするまで
echo "$input" | sed '2,/ケーキ/ d'
りんごジュース 100円
チョコケーキ 400円
# 1行目から、2行目以降で最初の「ジュース」にマッチするまで
echo "$input" | sed '1,/ジュース/ d'
いちごケーキ 300円
チョコケーキ 400円
# 「0,正規表現」というアドレスの場合で先頭が正規表現にマッチしたら、先頭のみが対象
echo "$input" | sed '0,/ジュース/ d'
みかんジュース 200円
いちごケーキ 300円
チョコケーキ 400円
下記は「りんご」を含む行から次の2行までを削除する。
input='りんごジュース 100円
みかんジュース 200円
いちごケーキ 300円
チョコケーキ 400円'
echo "$input" | sed '/りんご/,+2 d'
チョコケーキ 400円
アドレス2個とも正規表現なら、下記のように対象となる範囲が複数の可能性がある。
input='#
開始
a
b
終了
X
開始
c
終了
Y'
echo "$input" | sed '/開始/,/終了/ d'
#
X
Y