sed (ストリーミングエディタ)
Option
n
標準出力を制御
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
| fukui-no-MacBook-Air:sed ftakao2007$ cat test_sed.txt
aaa
bbb123
ccc
fukui-no-MacBook-Air:sed ftakao2007$ sed '/bbb/p' test_sed.txt
aaa
bbb123
bbb123
ccc
* bbbが含まれている行があればその行を出力するという処理。
nオプション無しだと、「テキストの内容+処理結果」となっている
fukui-no-MacBook-Air:sed ftakao2007$ sed -n '/bbb/p' test_sed.txt
bbb123
* nオプションをつけると処理結果のみ出力
fukui-no-MacBook-Air:sed ftakao2007$ sed -n '/bbb/d' test_sed.txt
* bbbが含まれる行を削除する処理。
nオプションをつけている場合は処理結果は何も表示されず、よくわからない。
fukui-no-MacBook-Air:sed ftakao2007$ sed '/bbb/d' test_sed.txt
aaa
ccc
* nオプション無しで実行すると、bbbの行が削除されている事が分かる。
|
- pで表示する場合はnをつけると目的の部分だけ出力できる
- dで削除する場合はnを付けなければ削除された行以外を出力できる
e
次にくる値はコマンドとみなす
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| fukui-no-MacBook-Air:sed ftakao2007$ cat test_sed.txt
aaa
bbb123
ccc
fukui-no-MacBook-Air:sed ftakao2007$ sed '/bbb/d' test_sed.txt
aaa
ccc
fukui-no-MacBook-Air:sed ftakao2007$ sed -e '/bbb/d' -e '/ccc/d' test_sed.txt
aaa
* bbbが含まれる行を削除し、cccが含まれる行も削除する
fukui-no-MacBook-Air:sed ftakao2007$ sed '/bbb/d' -e '/ccc/d' test_sed.txt
sed: -e: No such file or directory
sed: /ccc/d: No such file or directory
aaa
ccc
* eオプションを使う場合はコマンドごとに明示的にeオプションを指定する必要がある
|
f
次にくる値はスクリプトとみなす
1
2
3
4
5
6
7
8
9
10
| fukui-no-MacBook-Air:sed ftakao2007$ cat test_sed.txt
aaa
bbb123
ccc
fukui-no-MacBook-Air:sed ftakao2007$ cat sed_test.sed
/bbb/p
fukui-no-MacBook-Air:sed ftakao2007$ sed -n -f sed_test.sed test_sed.txt
bbb123
|
i
標準出力に出力せず、直接ファイルを書き換える
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| fukui-no-MacBook-Air:sed ftakao2007$ cat test_sed.txt
aaa
bbb123
ccc
fukui-no-MacBook-Air:sed ftakao2007$ sed -i.bak '/bbb/d' test_sed.txt
fukui-no-MacBook-Air:sed ftakao2007$ cat test_sed.txt
aaa
ccc
fukui-no-MacBook-Air:sed ftakao2007$ cat test_sed.txt.bak
aaa
bbb123
ccc
* .bakにバックアップをとって元ファイルはbbbを含む行が削除されている
fukui-no-MacBook-Air:sed ftakao2007$ sed -i '/bbb/d' test_sed.txt
sed: 1: "test_sed2.txt": undefined label 'est_sed.txt'
* 拡張子を指定しない場合はエラーになる
|
Command
p
出力する
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
| fukui-no-MacBook-Air:sed ftakao2007$ cat test_sed.txt
aaa
bbb123
ccc
fukui-no-MacBook-Air:sed ftakao2007$ sed -n '1,2p' test_sed.txt
aaa
bbb123
* 1-2行目を出力
fukui-no-MacBook-Air:sed ftakao2007$ sed -n '3p' test_sed.txt
ccc
* 3行目を出力
fukui-no-MacBook-Air:sed ftakao2007$ sed -n '/bbb/p' test_sed.txt
bbb123
* bbbが含まれる行を出力
fukui-no-MacBook-Air:sed ftakao2007$ sed -n '$p' test_sed.txt
ccc
* 最後の行を出力
|
d
削除する
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
| fukui-no-MacBook-Air:sed ftakao2007$ cat test_sed.txt
aaa
bbb123
ccc
fukui-no-MacBook-Air:sed ftakao2007$ sed '1,2d' test_sed.txt
ccc
* 1-2行目を削除
fukui-no-MacBook-Air:sed ftakao2007$ sed '3d' test_sed.txt
aaa
bbb123
* 3行目を削除
fukui-no-MacBook-Air:sed ftakao2007$ sed '/bbb/d' test_sed.txt
aaa
ccc
* bbbが含まれる行を削除
fukui-no-MacBook-Air:sed ftakao2007$ sed '$d' test_sed.txt
aaa
bbb123
* 最後の行を削除
|
q
特定の文字列が含まれる行まで表示
1
2
3
4
5
6
7
8
9
10
11
12
| fukui-no-MacBook-Air:sed ftakao2007$ cat test_sed3.txt
aaa
bbbb123bbb456bbb
ccc
bbb789bbb
fukui-no-MacBook-Air:sed ftakao2007$ sed '/ccc/q' test_sed3.txt
aaa
bbbb123bbb456bbb
ccc
* cccが含まれる行まで表示
|
s
置換する
1
2
3
4
5
6
7
8
9
10
11
| fukui-no-MacBook-Air:sed ftakao2007$ cat test_sed.txt
aaa
bbb123
ccc
fukui-no-MacBook-Air:sed ftakao2007$ sed 's/bbb/xxx/' test_sed.txt
aaa
xxx123
ccc
* bbbをxxxに置換
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| fukui-no-MacBook-Air:sed ftakao2007$ cat test_sed3.txt
aaa
bbb123bbb456bbb
ccc
bbb789bbb
fukui-no-MacBook-Air:sed ftakao2007$ sed 's/bbb/xxx/' test_sed3.txt
aaa
xxx123bbb456bbb
ccc
xxx789bbb
* gオプションが無い場合は最初のみ置換される
fukui-no-MacBook-Air:sed ftakao2007$ sed 's/bbb/xxx/g' test_sed3.txt
aaa
xxx123xxx456xxx
ccc
xxx789xxx
* gオプションをつけると全てが置換される
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| fukui-no-MacBook-Air:sed ftakao2007$ cat test_sed3.txt
aaa
bbbb123bbb456bbb
ccc
bbb789bbb
fukui-no-MacBook-Air:sed ftakao2007$ sed 's/bbb/ddd/1' test_sed3.txt
aaa
dddb123bbb456bbb
ccc
ddd789bbb
fukui-no-MacBook-Air:sed ftakao2007$ sed 's/bbb/ddd/2' test_sed3.txt
aaa
bbbb123ddd456bbb
ccc
bbb789ddd
fukui-no-MacBook-Air:sed ftakao2007$ sed 's/bbb/ddd/3' test_sed3.txt
aaa
bbbb123bbb456ddd
ccc
bbb789bbb
|
- p
パターンスペースの先頭セグメントから最初の復帰改行までを標準出力に出力する
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| fukui-no-MacBook-Air:sed ftakao2007$ cat test_sed3.txt
aaa
bbbb123bbb456bbb
ccc
bbb789bbb
fukui-no-MacBook-Air:sed ftakao2007$ sed -n 's/bbb/ddd/p1' test_sed3.txt
dddb123bbb456bbb
ddd789bbb
fukui-no-MacBook-Air:sed ftakao2007$ sed -n 's/bbb/ddd/p2' test_sed3.txt
bbbb123ddd456bbb
bbb789ddd
fukui-no-MacBook-Air:sed ftakao2007$ sed -n 's/bbb/ddd/p3' test_sed3.txt
bbbb123bbb456ddd
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
| fukui-no-MacBook-Air:sed ftakao2007$ cat test_sed3.txt
aaa
bbbb123bbb456bbb
ccc
bbb789bbb
fukui-no-MacBook-Air:sed ftakao2007$ sed -n '/bbb/w bbb.txt <-ここで一度改行されている
/bbb/!w aaa.txt' test_sed3.txt
fukui-no-MacBook-Air:sed ftakao2007$ cat bbb.txt
bbbb123bbb456bbb
bbb789bbb
fukui-no-MacBook-Air:sed ftakao2007$ cat aaa.txt
aaa
ccc
* bbbにマッチした行をbbb.txtへ、マッチしなかった行をaaa.txtへ書き出す
========================
fukui-no-MacBook-Air:sed ftakao2007$ cat test_sed3.txt
aaa
bbbb123bbb456bbb
ccc
bbb789bbb
fukui-no-MacBook-Air:sed ftakao2007$ sed 's/bbb/ddd/gw ddd.txt' test_sed3.txt > change.txt
fukui-no-MacBook-Air:sed ftakao2007$ cat ddd.txt
dddb123ddd456ddd
ddd789ddd
fukui-no-MacBook-Air:sed ftakao2007$ cat change.txt
aaa
dddb123ddd456ddd
ccc
ddd789ddd
fukui-no-MacBook-Air:sed ftakao2007$
* 変換された行のみddd.txtに保存、変換後の全行をchange.txtに出力
|
Match
空行以外を出力
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| fukui-no-MacBook-Air:sed ftakao2007$ cat test_sed4.txt
aaa
bbbb123bbb456bbb
ccc
bbb789bbb
fukui-no-MacBook-Air:sed ftakao2007$ sed -n '/./p' test_sed4.txt
aaa
bbbb123bbb456bbb
ccc
bbb789bbb
* 空行以外の行を出力
|
空行を出力
1
2
3
4
5
6
7
8
9
10
11
12
13
| fukui-no-MacBook-Air:sed ftakao2007$ cat test_sed4.txt
aaa
bbbb123bbb456bbb
ccc
bbb789bbb
fukui-no-MacBook-Air:sed ftakao2007$ sed -n '/^$/p' test_sed4.txt
* 空行を出力
(例は空行2行分が出力されている)
|
最初の空行から次の空行までを出力
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
| fukui-no-MacBook-Air:sed ftakao2007$ cat test_sed4.txt
aaa
bbbb123bbb456bbb
ccc
bbb789bbb
fukui-no-MacBook-Air:sed ftakao2007$ sed -ne '/^$/,/^$/p' test_sed4.txt
bbbb123bbb456bbb
ccc
* 最初の空行から次の空行までが出力されている
fukui-no-MacBook-Air:sed ftakao2007$ sed -ne '/^$/,/^$/p' test_sed4.txt | sed -e '/^$/d'
bbbb123bbb456bbb
ccc
* マッチした最初と最後の空行自体は削除して表示
fukui-no-MacBook-Air:sed ftakao2007$ sed -ne '/^$/,/^$/p' test_sed4.txt | sed -ne '/./p'
bbbb123bbb456bbb
ccc
* 上と同じ結果
|
最初の空行から次の空行までの行を削除
1
2
3
4
5
6
7
8
9
10
11
12
| fukui-no-MacBook-Air:sed ftakao2007$ cat test_sed4.txt
aaa
bbbb123bbb456bbb
ccc
bbb789bbb
fukui-no-MacBook-Air:sed ftakao2007$ sed -e '/^$/,/^$/d' test_sed4.txt
aaa
bbb789bbb
fukui-no-MacBook-Air:sed ftakao2007$
|
Advance
正規表現(?)
&
置換のときに省略して記載できる
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| fukui-no-MacBook-Air:sed ftakao2007$ cat test_sed.txt
aaa
bbb123
ccc
fukui-no-MacBook-Air:sed ftakao2007$ sed 's/bbb/bbb_add_/' test_sed.txt
aaa
bbb_add_123
ccc
* bbbの直後に_add_を追加する
fukui-no-MacBook-Air:sed ftakao2007$ sed 's/bbb/&_add_/' test_sed.txt
aaa
bbb_add_123
ccc
* 先ほどと同じ結果。「bbb」のかわりに「&」で指定
|
区切り位置
区切り位置を/
の代わりに;
にすると、/
をエスケープしなくても良くなる
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| fukui-no-MacBook-Air:DATA ftakao2007$ cat 3.html | gsed -e 's/<\/td>/&\n/g'
<table>
<tr>
<td>a</td>
<td>b</td>
<td>c</td>
</tr>
</table>
fukui-no-MacBook-Air:DATA ftakao2007$ cat 3.html | gsed -e 's;</td>;&\n;g'
<table>
<tr>
<td>a</td>
<td>b</td>
<td>c</td>
</tr>
</table>
|
参考