Octopress Blog

自分のためのまとめブログ

Sed

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に置換
  • g すべてのパターンに対して処理を実行する
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オプションをつけると全てが置換される
  • n(整数) n番目の発生を置換
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
  • w ファイルへ書き出す
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>

参考