1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

sed メモランダム

Posted at

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


#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;となる。
}

表示されるのは常にパターンスペースのものだということに注意。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?