正規表現のパターン指定をさらに完結にしたい
※「シス環系女子 season2 第9話」の備忘録です。
拡張正規表現テクニック
- [0-9]+
全ての数字を表す。ex)0, 4, 15, 100, 2021, etc...
正規表現の「+」や「*」は、前の文字の表現の繰り返しを表す。
以下テストデータ
$ cat test_for_sed2.log
category100a
category200b
category300c
以下は2つは同じ意味。
※mac os で「-e」で後方参照が実行できなかった。
$ cat test_for_sed2.log | sed -E "s/category(100|200|300)/category-\1-/"
category-100-a
category-200-b
category-300-c
$ cat test_for_sed2.log | sed -E "s/category([0-9]+)/category-\1-/"
category-100-a
category-200-b
category-300-c
- [^]
ブラケットの中で使うことで後に続く文字列以外を表す。
※「キャレット」あるいは「ハット」と読む。
ex)[a-d]=a~dの文字列ならなんでも良い。
ex)[^a-d]=a~d以外の文字列ならなんでも良い。
ex)[^:]=:以外の文字列ならなんでも良い。
以下テストデータ
$ cat test_for_sed3.log
http://192.160.11.150:3000/
http://penguin:3000/
以下2つは同じ意味
$ cat test_for_sed3.log | sed -E "s/(192.160.11.150|penguin):3000/\1:13000/"
http://192.160.11.150:13000/
http://penguin:13000/
$ cat test_for_sed3.log | sed -E "s#(://[^:]+):3000#\1:13000#"
http://192.160.11.150:13000/
http://penguin:13000/
- ^
行の先頭文字列のみ表す拡張正規表現。
以下テストデータ
$ cat test_for_sed4.log
# 拡張正規表現のテストデータ
- hoge
- fuga - fuga
- piyo - piyo
- foo - foo - foo
- bar - bar - bar
- baz - baz
項目文字の「-」を「*」に変換したい時。
以下だと文字列中の「-」まで変換されてしまう。
$ cat test_for_sed4.log | sed -E "s/( | | )- /\1* /g"
# 拡張正規表現のテストデータ
* hoge
* fuga * fuga
* piyo * piyo
* foo * foo * foo
* bar * bar * bar
* baz * baz
そこで先頭文字を表す「^」を使うようにする。
以下、その例。
$ cat test_for_sed4.log | sed -E "s/^( | | )- /\1* /g"
# 拡張正規表現のテストデータ
* hoge
* fuga - fuga
* piyo - piyo
* foo - foo - foo
* bar - bar - bar
* baz - baz
さらにスペースの表現を以下のように変えるとスッキリする。
$ cat test_for_sed4.log | sed -E "s/^( +)- /\1* /g"
# 拡張正規表現のテストデータ
* hoge
* fuga - fuga
* piyo - piyo
* foo - foo - foo
* bar - bar - bar
* baz - baz
- $
文字列の最後を表す。
$ cat test_for_sed5.log
hoge。
fuga。fuga。
piyo。piyo。piyo。
以下のように使うことで、最後の「。」だけ変換させることができる。
$ cat test_for_sed5.log | sed -E "s/。$/./"
hoge.
fuga。fuga.
piyo。piyo。piyo.