@@ -20,7 +20,7 @@ sed / awkの使い方を説明するにあたって、まず `ed` コマンド
20
20
ed ファイル名
21
21
```
22
22
23
- 試しに、 ` ed SONG .md ` と入力してみると、まずファイル内の文字数が表示されます。
23
+ 試しに、 ` ed romeo_and_juliet .md ` と入力してみると、まずファイル内の文字数が表示されます。
24
24
これだけでは、何が起こっているかわからないので、ファイルの中身を探索してみましょう。
25
25
26
26
```
@@ -62,12 +62,12 @@ edへの命令は、 `アドレス+コマンド` で構成されている
62
62
63
63
#### その他のアドレス
64
64
65
- * . => 現在の行
66
- * $ => 最後の行
67
- * - => 直前の行
68
- * -n => n個前の行
69
- * + => 直後の行
70
- * +n => n個後の行
65
+ * ` . ` => 現在の行
66
+ * ` $ ` => 最後の行
67
+ * ` - ` => 直前の行
68
+ * ` -n ` => n個前の行
69
+ * ` + ` => 直後の行
70
+ * ` +n ` => n個後の行
71
71
72
72
` man ed ` にわかりやすく書かれているので、困ったら参照してみてください。
73
73
@@ -83,16 +83,19 @@ edへの命令は、 `アドレス+コマンド` で構成されている
83
83
` 1,3p ` と入れれば 1~ 3行目がprintされる
84
84
` 1,$p ` と入れれば 1行目から最終行までがprintされる
85
85
` 2,/Romeo/p ` と入れれば、1行目から次のRomeoまでがprintされる
86
+ ` /ROMEO/,/JULIET/p ` と入れれば、次のROMEOからその次のJULIETまでがprintされる
86
87
87
88
### コマンドを使う
88
89
89
90
` p ` コマンドしか登場しませんでしたが、ここでいくつか追加のコマンドを紹介します。
90
91
91
92
#### 迷った時に使えるコマンド
92
93
93
- * = => 指定した位置のアドレスを表示する。 ` .= ` と入れると現在位置のアドレスが見られて便利。
94
- * n => 行番号付きでprintする。めちゃめちゃ便利。
95
- * h => 直前のエラー内容を出力する。` ? ` が出た時に使う。
94
+ * ` = ` => 指定した位置のアドレスを表示する。 ` .= ` と入れると現在位置のアドレスが見られて便利。
95
+ * ` n ` => 行番号付きでprintする。めちゃめちゃ便利。
96
+ * ` h ` => 直前のエラー内容を出力する。` ? ` が出た時に使う。
97
+ * ` H ` => ` h ` を入力しなくても常にエラー内容を出力する
98
+ - 起動時に ` H ` を打っておくのがおすすめ
96
99
97
100
#### 置換でめちゃめちゃ使うコマンド
98
101
@@ -101,36 +104,39 @@ edへの命令は、 `アドレス+コマンド` で構成されている
101
104
102
105
例) /Romeo/ を /Hoge/ に置き換えてみる
103
106
104
- ` 1s/Romeo/Hoge/ ` と入力してみましょう。
107
+ ` 54p ` と入力してみましょう。
105
108
106
- 結果を ` p ` で確認すると、 ` ## Hoge—In Praise of Babel ` に変更されていることがわかります 。
109
+ すると、 ` O Romeo, Romeo! wherefore art thou Romeo? ` と言う ` Romeo ` が3回登場する行が見つかります 。
107
110
108
- 次に、グローバル置換を使ってみましょう 。
111
+ ここで、 ` 54s/Romeo/Hoge/ ` と入力してみましょう 。
109
112
110
- ` /wherefore art thou Romeo/p ` を実行すると、 ` Romeo ` が複数回登場する行が見つかります。
111
- ` .= ` で現在の行を確認すると、` 54 ` とわかるので、` 54s/Romeo/Hoge/g ` を実行してみましょう。
113
+ 結果を ` p ` で確認すると、 ` O Hoge, Romeo! wherefore art thou Romeo? ` に変更されていることがわかります。
112
114
113
- 結果を ` p ` で確認すると、 ` O Hoge, Hoge! ... ` に変更されていることがわかります。
115
+ 次に、グローバル置換を紹介します。
116
+
117
+ ` 54s/Romeo/Hoge/g ` を実行してみましょう。
118
+
119
+ 結果を ` p ` で確認すると、行内のRomeoが全て置き換えられ、 ` O Hoge, Hoge! wherefore art thou Hoge? ` に変更されていることがわかります。
114
120
115
121
#### Viを彷彿とさせるコマンド
116
122
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 ` => エディタを終了する
124
130
125
131
Insert modeからは ^C で抜けることが出来ます。
126
132
Insert mode中では、複数行のテキストを入力可能で、あくまで行単位での編集となるので、行が挿入、追加、置換(変更)されることになります。
127
133
128
134
ed にはこれだけのコマンドが揃っているので、一通りのテキスト編集が実施可能です。
129
135
それでは、実際にコードを編集してみましょう。
130
136
131
- ` ed ed1.js `
137
+ ` ed ed1.go `
132
138
133
- 編集した ` wq ` で保存した結果、 ` node ed1.js ` が通るようになればOKです。
139
+ 編集した ` wq ` で保存した結果、 ` go run ed1.go ` が通るようになればOKです。
134
140
135
141
新規でファイルを作成したい場合は、
136
142
` ed ファイル名 ` でファイルを作成し、 ` i ` で内容を挿入して ` wq ` で抜ければOKです。
@@ -143,21 +149,29 @@ edの命令は `アドレス+コマンド` で実行できると言う話をし
143
149
144
150
次のファイルを編集してみてください。
145
151
146
- ` ed ed2.js `
152
+ ` ed ed2.go `
147
153
148
154
地獄のような内容になっているかと思います。
149
155
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 ` も使うことが出来ます。
153
159
154
- ここまで出来たら、 ` Hello ` を全て ` Hoge ` に置き換えて、 ` node exmaple2.js ` が動くことを確認してみてください。
160
+ あとはプログラムに問題のある箇所があるので、それを修正して ` go run ed2.go ` が動くことを確認してみてください。
155
161
156
162
### 小話
157
163
158
164
` grep ` コマンドの名前の由来は、edコマンドの ` g/re/p ` らしいです。
159
165
` echo 'g/Romeo/p' | ed -s romeo_and_juliet.md ` してみると、なるほど感が得られると思います。
160
166
167
+ ### さらに小話
168
+
169
+ ` 1,$ ` のrangeに対するエイリアスとして ` % ` が存在します。
170
+ ` %p ` と実行すると、ファイル全体を表示することが出来ます。
171
+ ここで、これを使って、ファイル全体の中でマッチする表現を置換するコマンドを実行しようとすると、
172
+ ` %s/Romeo/Juliet/g ` といった形になります。
173
+ この形式のコマンドに見覚えのある方も多いのではないでしょうか? (Vimでよく使う置換コマンドです)
174
+
161
175
## sedハンズオン
162
176
163
177
ついにここでsedに入ります。
@@ -173,52 +187,52 @@ edでは、アドレスを指定しないと編集操作が出来ませんでし
173
187
sedの使い方は簡単です。
174
188
edの命令部を引数として与え、それを適用するファイルを指定するだけです。
175
189
176
- ` sed '' sed1.js `
190
+ ` sed '' sed1.go `
177
191
178
192
sedは、デフォルトで操作結果の行を全てprintするようになっているので、空の命令を与えると全行がそのまま出力されます。
179
193
180
194
これを抑制したい場合は、 ` sed -n ` を使います。
181
195
182
- ` sed -n '' sed1.js `
196
+ ` sed -n '' sed1.go `
183
197
184
198
は何も表示しませんが、
185
199
186
- ` sed -n 'p' sed1.js `
200
+ ` sed -n 'p' sed1.go `
187
201
188
202
は全行を表示します。edっぽさが顔を出しましたね。
189
203
190
- 続いて、 ` gonsole ` の置換操作をしてみましょう。
204
+ 続いて、 ` Brintln ` の置換操作をしてみましょう。
191
205
192
- ` sed 's/gonsole/console /' sed1.js `
206
+ ` sed 's/Brintln/Println /' sed1.go `
193
207
194
- を実行すると、行にマッチした1つ目のgonsoleが置き換えられ 、
208
+ を実行すると、行にマッチした1つ目のBrintlnが置き換えられ 、
195
209
196
- ` sed 's/gonsole/console /g' sed1.js `
210
+ ` sed 's/Brintln/Println /g' sed1.go `
197
211
198
- を実行すると、行にマッチした全てのgonsoleが置き換えられることがわかります 。
212
+ を実行すると、行にマッチした全てのBrintlnが置き換えられることがわかります 。
199
213
200
214
次に、アドレスを使ってみましょう。
201
215
202
- ` sed '2,3s/gonsole/console /g' sed1.js `
216
+ ` sed '6,7s/Brintln/Println /g' sed1.go `
203
217
204
- を実行すると、2 ~ 3行目のgonsoleだけがconsoleに置き換えられます 。
218
+ を実行すると、6 ~ 7行目のBrintlnだけがPrintlnに置き換えられます 。
205
219
206
- ` sed '2,4d ' sed1.js `
220
+ ` sed '6,7d ' sed1.go `
207
221
208
222
を実行すると、2~ 4行目が削除されます。
209
223
210
224
sedへの命令は複数渡すことが出来ます。
211
225
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 `
213
227
214
- のように ` ; ` 繋ぎで命令を書くと、2 ~ 3行目のgonsoleがconsoleに、3 ~ 4行目のHelloがHogeに置き換えられます 。
228
+ のように ` ; ` 繋ぎで命令を書くと、6 ~ 7行目のBrintlnがPrintlnに、8 ~ 9行目のHelloがHogeに置き換えられます 。
215
229
216
230
と言う形で、edのアドレス&コマンドの操作をそのままファイル単位で使えるのがsedという事が伝わったかと思います。
217
231
(実際には、使えないコマンドもかなり多いようです。sedの方がコマンドが少ない…。)
218
232
219
- 最後に、 ` sed1.js ` を修正した結果を ` sed1-ans.js ` に出力して ` node sed1-ans.js ` が実行できたら完了です。
233
+ 最後に、 ` sed1.go ` を修正した結果を ` sed1-ans.go ` に出力して ` go run sed1-ans.go ` が実行できたら完了です。
220
234
221
- ` sed '???' sed1.js > sed1-ans.js `
235
+ ` sed '???' sed1.go > sed1-ans.go `
222
236
223
237
## awkハンズオン
224
238
@@ -228,24 +242,24 @@ awkも、sedと同様なファイル単位での編集を志向するツール
228
242
229
243
下記のコマンドを実行してみてください。
230
244
231
- ` awk '{print}' awk1.js `
245
+ ` awk '{print}' awk1.go `
232
246
233
247
awkは、明示的にprintを行うよう指定しないと、何も出力しません。
234
248
235
- ` awk '' awk1.js `
249
+ ` awk '' awk1.go `
236
250
237
251
アドレスについては、正規表現アドレスはed / sedと共通です。
238
252
239
- ` awk '/gonsole /{print}' awk1.js `
253
+ ` awk '/Brintln /{print}' awk1.go `
240
254
241
255
awkは、 ` ` をセパレータとして、入力を分割する機能を持ちます。
242
256
243
- ` awk '{ print $0 }' awk1.js `
257
+ ` awk '{ print $0 }' awk1.go `
244
258
245
259
は行全体、
246
260
247
- ` awk '{ print $1 }' awk1.js `
248
- ` awk '{ print $2 }' awk1.js `
261
+ ` awk '{ print $1 }' awk1.go `
262
+ ` awk '{ print $2 }' awk1.go `
249
263
250
264
はスペース区切りです。
251
265
@@ -265,3 +279,4 @@ awkは、 ` ` をセパレータとして、入力を分割する機能を持ち
265
279
266
280
` awk -F, '{ printf("UPDATE Users SET...", $0, $1...)} `
267
281
282
+ 例題として、IDのみを出力するawkコマンドを書いて、 ` user_ids.csv ` に出力してみてください。
0 commit comments