正規表現アドレス

正規表現アドレスの書式と例
書式 意味
/正規表現/ /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円

正規表現にマッチした行に加えてn行を範囲とする例

下記は「りんご」を含む行から次の2行までを削除する。

input='りんごジュース 100円
みかんジュース 200円
いちごケーキ 300円
チョコケーキ 400円'

echo "$input" | sed '/りんご/,+2 d'
チョコケーキ 400円

アドレス2個とも正規表現の場合

アドレス2個とも正規表現なら、下記のように対象となる範囲が複数の可能性がある。

input='#
開始
a
b
終了
X
開始
c
終了
Y'

echo "$input" | sed '/開始/,/終了/ d'
#
X
Y