sed メモランダム

***
ドットインストールの学習メモです
***

#sedとは？

* コマンドラインから使えるテキスト処理ツール。
* 大量のテキストに対して一括の処理を行える。
* 正規表現、unixコマンド,vim

```terminal
DOTINSTALL $ cat names.txt 
mata
sasa
koko
naya
jeje
DOTINSTALL $ sed -e '3d' names.txt 
mata
sasa
naya
jeje
DOTINSTALL $ 
```
３行目の表示が消えた

```terminal
DOTINSTALL $ sed -i.bak '3d' names.txt 
DOTINSTALL $ cat names.txt 
mata
sasa
naya
jeje
DOTINSTALL $ 
```
バックアップを取りながら３行目が消えた状態で上書きをした。


```terminal
DOTINSTALL $ vim ex1.sed 
DOTINSTALL $ sed -f ex1.sed names.txt 
mata
sasa
naya
jeje
```
ex1.sedには3dのみを記述
ex1.sedを使って　names.txtの内容の表示を変えた。

##パターンスペース

```
sed '3d' names.txt

3 adress
d command
３行目を削除しなさいという意味になる

1.fileから１行読み込んでパターンスペースに格納
2.adressにマッチ？　commandを実行
3.パターンスペースを表示
（１行目２行目とスルーしてから３行目でcommand実行）
(パターンスペースに入れていた３行目を削除した,そして表示)
```

##アドレスを使いこなそう
```
1,3を消す
DOTINSTALL $ sed '1d;3d' names.txt 
2 sasa
4 naya
5 jeje

3以外消す
DOTINSTALL $ sed '3!d' names.txt 
3 koko

１から３まで消す
DOTINSTALL $ sed '1,3d' names.txt 
4 naya
5 jeje

最後がaでおわる行を消す
DOTINSTALL $ sed '/a$/d' names.txt 
3 koko
5 jeje

全ての行でdをする（消す）
DOTINSTALL $ sed 'd' names.txt 
なし
```

##p/a/iコマンド

```
[vagrant@localhost sed_lessons]$ sed -n '3p' names.txt 
3 koko
[vagrant@localhost sed_lessons]$ sed '3q' names.txt 
1 mata
2 sasa
3 koko
[vagrant@localhost sed_lessons]$ sed '1i\---start---' names.txt 
---start---
1 mata
2 sasa
3 koko
4 naya
5 jeje
[vagrant@localhost sed_lessons]$ sed -e '1i\---start---' -e '$a\---end---' names.txt 
---start---
1 mata
2 sasa
3 koko
4 naya
5 jeje
---end---
[vagrant@localhost sed_lessons]$ sed -e '1i\---start---' -e '$i\---end---' names.txt 
---start---
1 mata
2 sasa
3 koko
4 naya
---end---
5 jeje
```

###yコマンドで置換

```
[vagrant@localhost sed_lessons]$ sed 'y/a/u/' names.txt 
1 mutu
2 susu
3 koko
4 nuyu
5 jeje

[vagrant@localhost sed_lessons]$ sed 'y/am/AM/' names.txt 
1 MAtA
2 sAsA
3 koko
4 nAyA
5 jeje
```

###sコマンドで置換

```

[vagrant@localhost sed_lessons]$ cat items.txt 
1 mata Apple,apple, apple,grape
2 sasa Banana, apple, Apple, lemon
3 koko Grape, apple, strawberry
4 naya cherry, pear, kiwi
5 jeje cherry,Cherry

appleをAppleに変換（最初に一つだけ）
[vagrant@localhost sed_lessons]$ sed 's/apple/Apple/' items.txt 
1 mata Apple,Apple, apple,grape
2 sasa Banana, Apple, Apple, lemon
3 koko Grape, Apple, strawberry
4 naya cherry, pear, kiwi
5 jeje cherry,Cherry

全てのappleをAppleに変換　フラグ　g
[vagrant@localhost sed_lessons]$ sed 's/apple/Apple/g' items.txt 
1 mata Apple,Apple, Apple,grape
2 sasa Banana, Apple, Apple, lemon
3 koko Grape, Apple, strawberry
4 naya cherry, pear, kiwi
5 jeje cherry,Cherry

2つめのappleをAppleに変換　フラグ　数字
[vagrant@localhost sed_lessons]$ sed 's/apple/Apple/2' items.txt 
1 mata Apple,apple, Apple,grape
2 sasa Banana, apple, Apple, lemon
3 koko Grape, apple, strawberry
4 naya cherry, pear, kiwi
5 jeje cherry,Cherry

大文字小文字を区別せずにappple, AppleをRingoにかえる　フラグ　i + g
[vagrant@localhost sed_lessons]$ sed 's/apple/Ringo/ig' items.txt 
1 mata Ringo,Ringo, Ringo,grape
2 sasa Banana, Ringo, Ringo, lemon
3 koko Grape, Ringo, strawberry
4 naya cherry, pear, kiwi
5 jeje cherry,Cherry

同じことを正規表現で
[vagrant@localhost sed_lessons]$ sed 's/[aA]pple/Ringo/g' items.txt 
1 mata Ringo,Ringo, Ringo,grape
2 sasa Banana, Ringo, Ringo, lemon
3 koko Grape, Ringo, strawberry
4 naya cherry, pear, kiwi
5 jeje cherry,Cherry
```

###&や\1を使って置換しよう

```
[vagrant@localhost sed_lessons]$ sed 's/[0-5]/【】/' items.txt 
【】 mata Apple,apple, apple,grape
【】 sasa Banana, apple, Apple, lemon
【】 koko Grape, apple, strawberry
【】 naya cherry, pear, kiwi
【】 jeje cherry,Cherry

[vagrant@localhost sed_lessons]$ sed 's/[0-5]/【&】/' items.txt 
【1】 mata Apple,apple, apple,grape
【2】 sasa Banana, apple, Apple, lemon
【3】 koko Grape, apple, strawberry
【4】 naya cherry, pear, kiwi
【5】 jeje cherry,Cherry
```

```
[vagrant@localhost sed_lessons]$ sed 's/\([0-5]\) \(.*\)/\2 【\1】/' items.txt 
mata Apple,apple, apple,grape 【1】
sasa Banana, apple, Apple, lemon 【2】
koko Grape, apple, strawberry 【3】
naya cherry, pear, kiwi 【4】
jeje cherry,Cherry 【5】
```
上はsedのsコマンドで置換をし、
検索した([0-5])と(.*)の場所を交換しようとしている。
()の前にはエスケープ文字の\が必ず入る。
s/の一番目、[0-5]は　\1,
s/の二番目、　  .\*は　\2　で表される。
カオス。

##ホールドスペースを使ってを使ってみよう

* ホールドスペース
 * パターンスペースの奥にある裏バッファーのようなもの。

***３つの命令***

* h:パターンスペースの中身をホールドスペースにコピー
* g:ホールドスペースの中身をパターンスペースにコピー
* x:両者を交換

```
[vagrant@localhost sed_lessons]$ cat style.css 
#main {
        color: red;
        font-weight: bold;
        font-size: 14px;
        background: green;
}


[vagrant@localhost sed_lessons]$ sed -f ex2.sed style.css 
#main {
        color: red;
        font-weight: bold;
        font-size: 14px;
        background: red;
}
```
background: green;　が　red　に変更されている。
なぜこうなるかというと

**sedファイルの中身を解説**

```
[vagrant@localhost sed_lessons]$ cat ex2.sed 
# color change

/color: / {　　２行目のcolorにヒット
        h　　　パターンの内容がホールドにコピーされる。　color :red;
        s/color: /background: /　　パターンのcolorがbackgroundに置換される
        x　　ホールドとパターンが入れ替え。ホールドがbackground: red;の状態で状態維持。
}
/background: / {　５行目のbackgroundにヒット
        g　現状ホールドにはbackground :red; パターンにはbackground: green;
           gによって、ホールド→パターンへコピー。　よって　background: red;となる。
}
```
表示されるのは常にパターンスペースのものだということに注意。