コマンドラインにおける正規表現とクオート

コマンドライン(bash)における正規表現の使い方と、正規表現をクオート(シングル、バック)で囲んだときの働きの違いなどについて、例でまとめてみた。


「行頭のピリオド」を表す正規表現をクオートがない / ある 状態で使ってみた。
当然だが、シングルクオートで囲ったほうが書きやすくわかりやすい。

$ echo string | sed -e s/^\\.//
string

$ echo .string | sed -e s/^\\.//
string

$ echo .string | sed -e 's/^\.//'
string


次に「行頭の『バックスラッシュ+任意の一文字』」を表す正規表現をクオートがない / ある 状態で使ってみた。
クオートがない場合、バックスラッシュを4つも並べることでようやく「1つのバックスラッシュ」を表すことができる。

$ echo .string | sed -e s/^\\\\.//
.string

$ echo \\string | sed -e s/^\\\\.//
tring

$ echo \\string | sed -e 's/^\\.//'
tring


余談だが、正規表現を使うコマンドをバッククオートで囲んでいた場合、置換処理が2回なされる。以下の例では、正規表現は「行頭のピリオド」を表している。

$ STR=
$ STR=`echo .string | sed -e s/^\\\\.//`
$ echo $STR
string


バックスラッシュが、以下のように2回処理される。

   s/^\\\\.// 
→ s/^\\.// 
→ s/^\.//


コマンドラインでの字句解析の仕様を正確に知らないのではっきりしたことは言えないが、おそらくバッククオート部分が切り出された時点と、バッククオート部分の内部で正規表現が切り出された時点の2回でバッククオートが処理されたと考えられる。