Skip to content

Commit b6fe5ee

Browse files
committed
Update commands
1 parent aaf6c3a commit b6fe5ee

File tree

9 files changed

+115
-78
lines changed

9 files changed

+115
-78
lines changed

Diff for: README.md

+66-51
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ sed / awkの使い方を説明するにあたって、まず `ed` コマンド
2020
ed ファイル名
2121
```
2222

23-
試しに、 `ed SONG.md` と入力してみると、まずファイル内の文字数が表示されます。
23+
試しに、 `ed romeo_and_juliet.md` と入力してみると、まずファイル内の文字数が表示されます。
2424
これだけでは、何が起こっているかわからないので、ファイルの中身を探索してみましょう。
2525

2626
```
@@ -62,12 +62,12 @@ edへの命令は、 `アドレス+コマンド` で構成されている
6262

6363
#### その他のアドレス
6464

65-
* . => 現在の行
66-
* $ => 最後の行
67-
* - => 直前の行
68-
* -n => n個前の行
69-
* + => 直後の行
70-
* +n => n個後の行
65+
* `.` => 現在の行
66+
* `$` => 最後の行
67+
* `-` => 直前の行
68+
* `-n` => n個前の行
69+
* `+` => 直後の行
70+
* `+n` => n個後の行
7171

7272
`man ed` にわかりやすく書かれているので、困ったら参照してみてください。
7373

@@ -83,16 +83,19 @@ edへの命令は、 `アドレス+コマンド` で構成されている
8383
`1,3p` と入れれば 1~3行目がprintされる
8484
`1,$p` と入れれば 1行目から最終行までがprintされる
8585
`2,/Romeo/p` と入れれば、1行目から次のRomeoまでがprintされる
86+
`/ROMEO/,/JULIET/p` と入れれば、次のROMEOからその次のJULIETまでがprintされる
8687

8788
### コマンドを使う
8889

8990
`p` コマンドしか登場しませんでしたが、ここでいくつか追加のコマンドを紹介します。
9091

9192
#### 迷った時に使えるコマンド
9293

93-
* = => 指定した位置のアドレスを表示する。 `.=` と入れると現在位置のアドレスが見られて便利。
94-
* n => 行番号付きでprintする。めちゃめちゃ便利。
95-
* h => 直前のエラー内容を出力する。`?` が出た時に使う。
94+
* `=` => 指定した位置のアドレスを表示する。 `.=` と入れると現在位置のアドレスが見られて便利。
95+
* `n` => 行番号付きでprintする。めちゃめちゃ便利。
96+
* `h` => 直前のエラー内容を出力する。`?` が出た時に使う。
97+
* `H` => `h` を入力しなくても常にエラー内容を出力する
98+
- 起動時に `H` を打っておくのがおすすめ
9699

97100
#### 置換でめちゃめちゃ使うコマンド
98101

@@ -101,36 +104,39 @@ edへの命令は、 `アドレス+コマンド` で構成されている
101104

102105
例) /Romeo/ を /Hoge/ に置き換えてみる
103106

104-
`1s/Romeo/Hoge/` と入力してみましょう。
107+
`54p` と入力してみましょう。
105108

106-
結果を `p` で確認すると、 `## Hoge—In Praise of Babel` に変更されていることがわかります
109+
すると、 `O Romeo, Romeo! wherefore art thou Romeo?` と言う `Romeo` が3回登場する行が見つかります
107110

108-
次に、グローバル置換を使ってみましょう
111+
ここで、 `54s/Romeo/Hoge/` と入力してみましょう
109112

110-
`/wherefore art thou Romeo/p` を実行すると、 `Romeo` が複数回登場する行が見つかります。
111-
`.=` で現在の行を確認すると、`54` とわかるので、`54s/Romeo/Hoge/g` を実行してみましょう。
113+
結果を `p` で確認すると、 `O Hoge, Romeo! wherefore art thou Romeo?` に変更されていることがわかります。
112114

113-
結果を `p` で確認すると、 `O Hoge, Hoge! ...` に変更されていることがわかります。
115+
次に、グローバル置換を紹介します。
116+
117+
`54s/Romeo/Hoge/g` を実行してみましょう。
118+
119+
結果を `p` で確認すると、行内のRomeoが全て置き換えられ、 `O Hoge, Hoge! wherefore art thou Hoge?` に変更されていることがわかります。
114120

115121
#### Viを彷彿とさせるコマンド
116122

117-
* i => 挿入。アドレスで指定された行に文字列を挿入する。範囲指定可能。実行するとInsert modeに入る。
118-
* a => 追加。次の行に文字列を追加する。実行するとInsert modeに入る。
119-
* d => 削除。アドレスで指定された行を削除する。範囲指定可能
120-
* c => 変更。アドレスで指定された行を置き換える。範囲指定可能。実行するとInsert modeに入る。
121-
* u => 直前の操作を取り消す。
122-
* w => 保存する
123-
* q => エディタを終了する
123+
* `i` => 挿入。アドレスで指定された行に文字列を挿入する。範囲指定可能。実行するとInsert modeに入る。
124+
* `a` => 追加。次の行に文字列を追加する。実行するとInsert modeに入る。
125+
* `d` => 削除。アドレスで指定された行を削除する。範囲指定可能
126+
* `c` => 変更。アドレスで指定された行を置き換える。範囲指定可能。実行するとInsert modeに入る。
127+
* `u` => 直前の操作を取り消す。
128+
* `w` => 保存する
129+
* `q` => エディタを終了する
124130

125131
Insert modeからは ^C で抜けることが出来ます。
126132
Insert mode中では、複数行のテキストを入力可能で、あくまで行単位での編集となるので、行が挿入、追加、置換(変更)されることになります。
127133

128134
ed にはこれだけのコマンドが揃っているので、一通りのテキスト編集が実施可能です。
129135
それでは、実際にコードを編集してみましょう。
130136

131-
`ed ed1.js`
137+
`ed ed1.go`
132138

133-
編集した `wq` で保存した結果、 `node ed1.js` が通るようになればOKです。
139+
編集した `wq` で保存した結果、 `go run ed1.go` が通るようになればOKです。
134140

135141
新規でファイルを作成したい場合は、
136142
`ed ファイル名` でファイルを作成し、 `i` で内容を挿入して `wq` で抜ければOKです。
@@ -143,21 +149,29 @@ edの命令は `アドレス+コマンド` で実行できると言う話をし
143149

144150
次のファイルを編集してみてください。
145151

146-
`ed ed2.js`
152+
`ed ed2.go`
147153

148154
地獄のような内容になっているかと思います。
149155

150-
これを実行できるようにするには、 `gonsole` を全て `console` に置き換える必要があります。
151-
ここで、 `g/gonsole/s/gonsole/console/g` を実行すると、全ての `gonsole``console` に置き換えることが出来ます。
152-
省略記法として、 `g/gonsole/s//console/g` も使うことが出来ます。
156+
これを実行できるようにするには、 `Brintln` を全て `Println` に置き換える必要があります。
157+
ここで、 `g/Brintln/s/Brintln/Println/g` を実行すると、全ての `Brintln``Println` に置き換えることが出来ます。
158+
省略記法として、 `g/Brintln/s//Println/g` も使うことが出来ます。
153159

154-
ここまで出来たら、 `Hello` を全て `Hoge` に置き換えて、 `node exmaple2.js` が動くことを確認してみてください。
160+
あとはプログラムに問題のある箇所があるので、それを修正して `go run ed2.go` が動くことを確認してみてください。
155161

156162
### 小話
157163

158164
`grep` コマンドの名前の由来は、edコマンドの `g/re/p` らしいです。
159165
`echo 'g/Romeo/p' | ed -s romeo_and_juliet.md` してみると、なるほど感が得られると思います。
160166

167+
### さらに小話
168+
169+
`1,$` のrangeに対するエイリアスとして `%` が存在します。
170+
`%p` と実行すると、ファイル全体を表示することが出来ます。
171+
ここで、これを使って、ファイル全体の中でマッチする表現を置換するコマンドを実行しようとすると、
172+
`%s/Romeo/Juliet/g` といった形になります。
173+
この形式のコマンドに見覚えのある方も多いのではないでしょうか? (Vimでよく使う置換コマンドです)
174+
161175
## sedハンズオン
162176

163177
ついにここでsedに入ります。
@@ -173,52 +187,52 @@ edでは、アドレスを指定しないと編集操作が出来ませんでし
173187
sedの使い方は簡単です。
174188
edの命令部を引数として与え、それを適用するファイルを指定するだけです。
175189

176-
`sed '' sed1.js`
190+
`sed '' sed1.go`
177191

178192
sedは、デフォルトで操作結果の行を全てprintするようになっているので、空の命令を与えると全行がそのまま出力されます。
179193

180194
これを抑制したい場合は、 `sed -n` を使います。
181195

182-
`sed -n '' sed1.js`
196+
`sed -n '' sed1.go`
183197

184198
は何も表示しませんが、
185199

186-
`sed -n 'p' sed1.js`
200+
`sed -n 'p' sed1.go`
187201

188202
は全行を表示します。edっぽさが顔を出しましたね。
189203

190-
続いて、 `gonsole` の置換操作をしてみましょう。
204+
続いて、 `Brintln` の置換操作をしてみましょう。
191205

192-
`sed 's/gonsole/console/' sed1.js`
206+
`sed 's/Brintln/Println/' sed1.go`
193207

194-
を実行すると、行にマッチした1つ目のgonsoleが置き換えられ
208+
を実行すると、行にマッチした1つ目のBrintlnが置き換えられ
195209

196-
`sed 's/gonsole/console/g' sed1.js`
210+
`sed 's/Brintln/Println/g' sed1.go`
197211

198-
を実行すると、行にマッチした全てのgonsoleが置き換えられることがわかります
212+
を実行すると、行にマッチした全てのBrintlnが置き換えられることがわかります
199213

200214
次に、アドレスを使ってみましょう。
201215

202-
`sed '2,3s/gonsole/console/g' sed1.js`
216+
`sed '6,7s/Brintln/Println/g' sed1.go`
203217

204-
を実行すると、2~3行目のgonsoleだけがconsoleに置き換えられます
218+
を実行すると、6~7行目のBrintlnだけがPrintlnに置き換えられます
205219

206-
`sed '2,4d' sed1.js`
220+
`sed '6,7d' sed1.go`
207221

208222
を実行すると、2~4行目が削除されます。
209223

210224
sedへの命令は複数渡すことが出来ます。
211225

212-
`sed '2,3s/gonsole/console/g;3,4s/Hello/Hoge/g' sed1.js`
226+
`sed '6,7s/Brintln/Println/g;8,9s/Hello/Hoge/g' sed1.go`
213227

214-
のように `;` 繋ぎで命令を書くと、2~3行目のgonsoleがconsoleに、3~4行目のHelloがHogeに置き換えられます
228+
のように `;` 繋ぎで命令を書くと、6~7行目のBrintlnがPrintlnに、8~9行目のHelloがHogeに置き換えられます
215229

216230
と言う形で、edのアドレス&コマンドの操作をそのままファイル単位で使えるのがsedという事が伝わったかと思います。
217231
(実際には、使えないコマンドもかなり多いようです。sedの方がコマンドが少ない…。)
218232

219-
最後に、 `sed1.js` を修正した結果を `sed1-ans.js` に出力して `node sed1-ans.js` が実行できたら完了です。
233+
最後に、 `sed1.go` を修正した結果を `sed1-ans.go` に出力して `go run sed1-ans.go` が実行できたら完了です。
220234

221-
`sed '???' sed1.js > sed1-ans.js`
235+
`sed '???' sed1.go > sed1-ans.go`
222236

223237
## awkハンズオン
224238

@@ -228,24 +242,24 @@ awkも、sedと同様なファイル単位での編集を志向するツール
228242

229243
下記のコマンドを実行してみてください。
230244

231-
`awk '{print}' awk1.js`
245+
`awk '{print}' awk1.go`
232246

233247
awkは、明示的にprintを行うよう指定しないと、何も出力しません。
234248

235-
`awk '' awk1.js`
249+
`awk '' awk1.go`
236250

237251
アドレスについては、正規表現アドレスはed / sedと共通です。
238252

239-
`awk '/gonsole/{print}' awk1.js`
253+
`awk '/Brintln/{print}' awk1.go`
240254

241255
awkは、 ` ` をセパレータとして、入力を分割する機能を持ちます。
242256

243-
`awk '{ print $0 }' awk1.js`
257+
`awk '{ print $0 }' awk1.go`
244258

245259
は行全体、
246260

247-
`awk '{ print $1 }' awk1.js`
248-
`awk '{ print $2 }' awk1.js`
261+
`awk '{ print $1 }' awk1.go`
262+
`awk '{ print $2 }' awk1.go`
249263

250264
はスペース区切りです。
251265

@@ -265,3 +279,4 @@ awkは、 ` ` をセパレータとして、入力を分割する機能を持ち
265279

266280
`awk -F, '{ printf("UPDATE Users SET...", $0, $1...)}`
267281

282+
例題として、IDのみを出力するawkコマンドを書いて、 `user_ids.csv` に出力してみてください。

Diff for: awk1.js renamed to awk1.go

File renamed without changes.

Diff for: ed1.go

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package main
2+
3+
import "fmt"
4+
5+
var count = 0
6+
7+
func increment() {
8+
c++
9+
}
10+
11+
func main() {
12+
ingrement()
13+
ingrement()
14+
fmt.Println(count)
15+
}

Diff for: ed1.js

-7
This file was deleted.

Diff for: ed2.go

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package main
2+
3+
import "fmt"
4+
5+
func hello() {
6+
fmt.Brintln("Hello, world!"); fmt.Brintln("Hello, ed!")
7+
fmt.Brintln("Hello, world!"); fmt.Brintln("Hello, ed!")
8+
fmt.Brintln("Hello, world!"); fmt.Brintln("Hello, ed!")
9+
fmt.Brintln("Hello, world!"); fmt.Brintln("Hello, ed!")
10+
}
11+
12+
func main() {
13+
hollo()
14+
}

Diff for: ed2.js

-7
This file was deleted.

Diff for: sed1.go

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package main
2+
3+
import "fmt"
4+
5+
func hello() {
6+
fmt.Brintln("Hello, world!"); fmt.Brintln("Hello, ed!")
7+
fmt.Brintln("Hello, world!"); fmt.Brintln("Hello, ed!")
8+
fmt.Brintln("Hello, world!"); fmt.Brintln("Hello, ed!")
9+
fmt.Brintln("Hello, world!"); fmt.Brintln("Hello, ed!")
10+
}
11+
12+
func main() {
13+
hollo()
14+
}

Diff for: sed1.js

-7
This file was deleted.

Diff for: users.csv

+6-6
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
Name,Age,Gender
2-
Tom,20,Male
3-
Jim,22,Male
4-
Ann,21,Female
5-
Tim,32,Male
6-
Cate,24,Female
1+
Name,Age,Gender,ID
2+
Tom Smith,20,Male,2DDB9DF2-D793-4A9A-BE42-81D1AAF02001
3+
Jim Smith,22,Male,2BAF49D0-FC10-428F-A409-BF9482227B6D
4+
Ann Cameron,21,Female,521ED759-3F6A-4926-8865-C500550FDFAE
5+
Tim Cameron,32,Male,2AA082C3-5BAE-4C63-B9FB-670E86A67963
6+
Cate Cameron,24,Female,E00DCE81-0690-498D-A4D2-FD74F3EDEAEF

0 commit comments

Comments
 (0)