数値キー項目をDWHから抽出したのはいいけど、DBには文字列型で格納されているから、'
(シングルクォート)で囲んで、レコードごとにカンマで区切りたい
そういうこと、よくありますよね。
Unix系OSのターミナル(もしくはWSL環境)にはsedというコマンドがあります。
ストリームエディタと呼ばれるエディタで、文字列の置換などを得意としています。
詳しいことは他の記事に譲るとして。
今回の用件は、
- 数値キー項目が1行ワンレコードとしてファイルに格納されている
111111
22222
3333
444
55555
....
- 各レコードの項目を
'
(シングルクォート)で囲みたい - 各レコードの末尾に
,
(カンマ)を入れたい
というものでした。
つまりこうなるはずです。
'111111',
'22222',
'3333',
'444',
'55555',
....
sedを使えばちょー簡単ですね。
$ sed -e "s/\([0-9]\+\)/'\1',/g" keys > result
結果を確認
$ cat result
111111
22222
3333
444
55555
....
なんでや?!
正規表現のグルーピングの括弧のエスケープを外してみる
$ sed -e "s/([0-9]\+)/'\1',/g" keys > result
sed: 1: "s/([0-9]\+)/'\1'/g
": \1 not defined in the RE
ようわからんけど怒られた・・・
-Eを-eにすればいい、みたいな記事もあったぞ(逆だけど)
$ sed -E "s/([0-9]\+)/'\1',/g" keys > result
$ cat result
111111
22222
3333
444
55555
....
だめだこりゃ
いっそ、正規表現の+
の前のエスケープも消したろ
$ sed -E "s/([0-9]+)/'\1',/g" keys > result
$ cat result
'111111',
'22222',
'3333',
'444',
'55555',
....
でけた!
・・・わからん。manコマンドで確認してみよう。
$ man sed
SED(1) BSD General Commands Manual SED(1)
NAME
sed -- stream editor
SYNOPSIS
sed [-Ealn] command [file ...]
sed [-Ealn] [-e command] [-f command_file] [-i extension] [file ...]
(中略)
-E Interpret regular expressions as extended (modern) regular
expressions rather than basic regular expressions (BRE's). The
re_format(7) manual page fully describes both formats.
-E
を使えば拡張(現代的な)正規表現がつかえるぞ、と。後方参照機能は拡張正規表現に含まれるぞな、もし、と。
Linuxのsedは(
,)
,+
などを\
(バックスラッシュ)でエスケープする必要があるのですが、MacOSの場合はいらないようです。
おまけ
面倒臭いのでコマンドを"
(ダブルクォート)で囲ってましたが、これを'
(シングルクォート)のままにする場合はどうなるのか
$ sed -E 's/([0-9]+)/'"'"'\1'"'"',/g' keys > result
$ cat result
'111111',
'22222',
'3333',
'444',
'55555',
....
-
'
でリテラルを閉じます -
"
で前側の'
を囲みます。("'"
) -
'
で後方参照(\1
)を囲みます('\1'
) -
"
で後ろ側の'
を囲みます。("'"
) -
'
で後ろ側の'
より後ろのリテラルを始めます
意外と苦労しました・・・