Bash

如何在匹配表達式中編寫正則表達式文字?

  • November 21, 2018

這個問題是關於在 bash 下的匹配表達式中編寫正則表達式文字的正確方法。

在 zsh 中,正如我所料,下面的匹配成功了:

% [[ ' 123 ' =~ '^ [0-9]+ $' ]]; echo $?
0

在 bash 中並非如此:

$ [[ ' 123 ' =~ '^ [0-9]+ $' ]]; echo $?
1

我知道這場比賽在 bash 中成功

$ ( regexp='^ [0-9]+ $'; [[ ' 123 ' =~ $regexp ]]; echo $? )
0

…但它需要將正則表達式分配給中間變數。


我的問題是:如何在 bash 下的匹配表達式中編寫任意正則表達式文字?

按照 Bash 參考手冊3.2.4.2 Conditional Constructs的建議,最好將其放入變數中:

將正則表達式儲存在 shell 變數中通常是避免引用 shell 特殊字元問題的有用方法。有時很難在不使用引號的情況下從字面上指定正則表達式,或者在註意 shell 的引號刪除時跟踪正則表達式使用的引號。使用 shell 變數來儲存模式可以減少這些問題。

但是,為了直接在 bash 擴展測試中編寫它,您需要刪除引號並轉義空格:

$ [[ ' 123 ' =~ ^\ [0-9]+\ $ ]]; echo $?
0

引用自:https://unix.stackexchange.com/questions/483292