ドットインストールの学習メモです
#sedとは?
- コマンドラインから使えるテキスト処理ツール。
- 大量のテキストに対して一括の処理を行える。
- 正規表現、unixコマンド,vim
DOTINSTALL $ cat names.txt
mata
sasa
koko
naya
jeje
DOTINSTALL $ sed -e '3d' names.txt
mata
sasa
naya
jeje
DOTINSTALL $
3行目の表示が消えた
DOTINSTALL $ sed -i.bak '3d' names.txt
DOTINSTALL $ cat names.txt
mata
sasa
naya
jeje
DOTINSTALL $
バックアップを取りながら3行目が消えた状態で上書きをした。
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
3行目を削除しなさいという意味になる
1.fileから1行読み込んでパターンスペースに格納
2.adressにマッチ? commandを実行
3.パターンスペースを表示
(1行目2行目とスルーしてから3行目でcommand実行)
(パターンスペースに入れていた3行目を削除した,そして表示)
##アドレスを使いこなそう
1,3を消す
DOTINSTALL $ sed '1d;3d' names.txt
2 sasa
4 naya
5 jeje
3以外消す
DOTINSTALL $ sed '3!d' names.txt
3 koko
1から3まで消す
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 で表される。
カオス。
##ホールドスペースを使ってを使ってみよう
- ホールドスペース
- パターンスペースの奥にある裏バッファーのようなもの。
3つの命令
- 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: / { 2行目のcolorにヒット
h パターンの内容がホールドにコピーされる。 color :red;
s/color: /background: / パターンのcolorがbackgroundに置換される
x ホールドとパターンが入れ替え。ホールドがbackground: red;の状態で状態維持。
}
/background: / { 5行目のbackgroundにヒット
g 現状ホールドにはbackground :red; パターンにはbackground: green;
gによって、ホールド→パターンへコピー。 よって background: red;となる。
}
表示されるのは常にパターンスペースのものだということに注意。