アドレスを指定することでsedのコマンドがどの行に対して実行するかを制御することができます。
アドレスの機能を確認するならiコマンドやaコマンド等の文字列を追加するコマンドが分かりやすいでしょう。
また、-nオプションで出力を抑制して、pコマンドで明示的に出力する行を指定して確認するのも分かりやすいでしょう。
アドレスを指定しない場合は、全ての行に対して、コマンドが実行されます。
test.txt
1 2 3 |
aaa bbb ccc |
実行例
1 2 3 4 5 6 7 |
$ sed 'a text' test.txt aaa text bbb text ccc text |
数字を1つ指定するとsedが処理しているその行番号に対して、数字を2つ指定するとその範囲に対して、コマンドが実行されます。
実行例
1 2 3 4 5 6 7 8 9 10 11 |
$ sed '2a text' test.txt aaa bbb text ccc $ sed '2,3a text' test.txt aaa bbb text ccc text |
最後の行を指定
アドレスで最後の行を指定する文字として'$'があります。
1 2 3 4 5 |
$ sed '$a text' test.txt aaa bbb ccc text |
ステップ
GNU拡張でステップを指定する方法があります。num~numのように指定します。
1 2 3 4 5 |
$ seq 10 | sed -n '1~3p' 1 4 7 10 |
正規表現で指定
数字の代わりに正規表現で指定することもできます。
1 2 3 4 5 |
$ sed '/bbb/a text' test.txt aaa bbb text ccc |
アドレスを2つ指定すると範囲を指定できます。test.txtを2つ繋げ、いくつかの例を示します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
$ cat test.txt test.txt | sed -n '/bbb/,/ccc/p' bbb ccc bbb ccc $ cat test.txt test.txt | sed -n '/bbb/,/bbb/p' bbb ccc aaa bbb $ cat test.txt test.txt | sed -n '/bbb/,/ddd/p' bbb ccc aaa bbb ccc $ cat test.txt test.txt | sed -n '3,/bbb/p' ccc aaa bbb |
否定
コマンドの前に'!'をつけることで指定行やアドレスの範囲を否定して、実行するかどうかを反転することができます。
指定行の否定
1 2 3 |
$ sed -n '2!p' test.txt aaa ccc |
範囲の否定
1 2 3 4 5 |
$ sed -n '2,3!p' test.txt aaa $ cat test.txt test.txt | sed -n '/bbb/,/ccc/!p' aaa aaa |