7
2

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 1 year has passed since last update.

echoコマンドのブレース展開で便利に連番の文字を作る

Last updated at Posted at 2023-06-02

中括弧({})を使用して複数の文字列を生成する機能を「ブレース展開」というそうです。

# 連番を作りたい
$ echo {0..31}
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31

# AからZまでの羅列を作りたい
$ echo {A..Z}
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

# ネストもできる
$ echo hoge{A{1..5},B{6..10}}
hogeA1 hogeA2 hogeA3 hogeA4 hogeA5 hogeB6 hogeB7 hogeB8 hogeB9 hogeB10

活用事例

これまで、知ってはいたけれどあまり使わずやり方も忘れていたのですが、ふと「書くの面倒くさいな」と思うSQLをこの「ブレース展開」で作ったところ大変便利でした。

(SQL)カラム名が連番のカラムでLIKE検索するWHERE句を作る

  • 環境 : GNU bash, version 4.4.23(2)-release (x86_64-pc-msys)

「name1_kana」というカラムが「1~13」まであるテーブルで、いずれかに「pon」が含まれるレコードを検索する場合のWHERE句を作る

  • ポイント
    1. 最後に「OR」が余分に出力されるので手動で削除して使う
    2. 繰り返し部分を「"」で囲う
$ echo WHERE name{1..13}"_kana LIKE '%pon%' OR"
WHERE name1_kana LIKE '%pon%' OR name2_kana LIKE '%pon%' OR name3_kana LIKE '%pon%' OR name4_kana LIKE '%pon%' OR name5_kana LIKE '%pon%' OR name6_kana LIKE '%pon%' OR name7_kana LIKE '%pon%' OR name8_kana LIKE '%pon%' OR name9_kana LIKE '%pon%' OR name10_kana LIKE '%pon%' OR name11_kana LIKE '%pon%' OR name12_kana LIKE '%pon%' OR name13_kana LIKE '%pon%' OR

# 失敗事例:「"」がなくてLIKE以降が繰り返されない
$ echo WHERE name{1..13}_kana LIKE '%pon%' OR
WHERE name1_kana name2_kana name3_kana name4_kana name5_kana name6_kana name7_kana name8_kana name9_kana name10_kana name11_kana name12_kana name13_kana LIKE %pon% OR

(SQL)同じカラムで複数文字をLIKE検索するSQLを作る

  • 環境 : GNU bash, version 4.4.23(2)-release (x86_64-pc-msys)

「column」というカラムに複数の任意の文字いずれかが含まれるレコードを検索する場合のSQLを作る

  • ポイント
    1. 最後に「OR」が余分に出力されるので手動で削除して使う
    2. 繰り返し部分は前後に別々に「"」で囲う
    3. SELECTでよく使う「*」はエスケープする
$ echo SELECT \* FROM table WHERE "column LIKE '%"{←,→,↓,↑,♪,☆,★,♂,♥,–}"%' OR "
SELECT * FROM table WHERE column LIKE '%←%' OR  column LIKE '%→%' OR  column LIKE '%↓%' OR  column LIKE '%↑%' OR  column LIKE '%♪%' OR  column LIKE '%☆%' OR  column LIKE '%★%' OR  column LIKE '%♂%' OR  column LIKE '%♥%' OR  column LIKE '%–%' OR 

# 失敗事例:「"」がなくて展開されない
$ echo SELECT \* FROM table WHERE column LIKE '%{←,→,↓,↑,♪,☆,★,♂,♥,–}%' OR
SELECT * FROM table WHERE column LIKE %{←,→,↓,↑,♪,☆,★,♂,♥,–}% OR
# 失敗事例:繰り返し部分を1セットの「"」で囲んで展開されない
$ echo SELECT \* FROM table WHERE "column LIKE '%{←,→,↓,↑,♪,☆,★,♂,♥,–}%' OR "
SELECT * FROM table WHERE column LIKE '%{←,→,↓,↑,♪,☆,★,♂,♥,–}%' OR
# 失敗事例:「*」をエスケープしないのでカレントディレクトリのファイル名が出力される
$ echo SELECT * FROM table WHERE "column LIKE '%"{←,→,↓,↑,♪,☆,★,♂,♥,–}"%' OR "
SELECT file.txt zip_file.zip FROM table WHERE column LIKE '%←%' OR  column LIKE '%→%' OR  column LIKE '%↓%' OR  column LIKE '%↑%' OR  column LIKE '%♪%' OR  column LIKE '%☆%' OR  column LIKE '%★%' OR  column LIKE '%♂%' OR  column LIKE '%♥%' OR  column LIKE '%–%' OR 

(SQL)同じ正規表現で複数カラムを検索するSQLを作る

  • 環境 : GNU bash, version 4.4.23(2)-release (x86_64-pc-msys)

MySQLにはREGEXP演算子があり、正規表現での検索ができる。

expr REGEXP pat, expr RLIKE pat
文字列 expr がパターン pat で指定された正規表現と一致する場合は 1 を返し、一致しない場合は 0 を返します。 expr または pat が NULL の場合、戻り値は NULL です。
MySQL :: MySQL 8.0 リファレンスマニュアル :: 12.8.2 正規表現

例えば、「column」列の値が「半角スペースで始まる」を書くとcolumn regexp '^ 'となりる。
複数の正規表現での検索もできて、「column」列の値が「全半角スペースで始まるまたは終わる」を書くとcolumn regexp '^( | )|( | )$'となる。

しかし、複数のカラムで「全半角スペースで始まるまたは終わる」を手動で書くのは面倒くさいのでechoを活用してSQLを作る。

$ echo SELECT \* FROM table WHERE {name,name_kana,uji,uji_kana,hoge,fuga}" REGEXP '^( | )|( | )$' OR"
SELECT * FROM table WHERE name REGEXP '^( | )|( | )$' OR name_kana REGEXP '^( | )|( | )$' OR uji REGEXP '^( | )|( | )$' OR uji_kana REGEXP '^( | )|( | )$' OR hoge REGEXP '^( | )|( | )$' OR fuga REGEXP '^( | )|( | )$' OR
7
2
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
7
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?