OSX Vs Linux(奇数)でのBash RegEx


4

これは、RegExを使用するポータブルBashスクリプトのBash開発とコーディングに関するものです

MacでBash RegExを使用すると、次のことができます。

coconut-mac$ a='bananacoconutman'; [[ "$a" =~ banana(.*?)man ]] && echo FOUND ${BASH_REMATCH[1]}
FOUND coconut

いいね 多くの場所で役立ちます。のような。

私がこれをしようとすると、失敗します:

coconut-mac$ a='<title>coconut</title>'; [[ "$a" =~ \<title\>(.*?)\</title\> ]] && echo FOUND ${BASH_REMATCH[1]}

まったく同じコマンドが実行され、完全ペンギンに:

coconut-linux$ a='<title>coconut</title>'; [[ "$a" =~ \<title\>(.*?)\</title\> ]] && echo FOUND ${BASH_REMATCH[1]}
FOUND coconut
  • どうして?
  • スクリプトを移植可能にするために修正する方法は?

編集:Macの場合:

OS X version: 10.8.2
Bash version: 4.2.37(2)-release

Ubuntu 12.04 LTSの場合:

Linux kernel version: 3.2.0-29-generic-pae
Linux version: Ubuntu 12.04.1 LTS
Bash version: 4.2.24(1)-release

各システムでどのバージョンのgrepを使用していますか?Linuxの単一バージョンはありません-どのフレーバー/バージョンを使用していますか?
マットボール

s / grep / bash />。>
Ignacio Vazquez-Abrams

回答:


4

私のMacではinfo bash / =~ RET次のように言います:

追加の二項演算子=~', is available, with the same precedence as== 'および `!='。使用される場合、演算子の右側の文字列は拡張正規表現と見なされ、それに応じて一致します(regex3のように)。

man 3 regex 言う:

繰り返し演算子(?',* '、+', or bounds) cannot follow another repetition operator. A repetition operator cannot begin an expression or subexpression or follow^'または `| '。

GNU regex man 3 regexやに類似のドキュメントはありませんinfo regex

?から削除(.*?)して次の操作を行うと、両方のOSで機能します。

$ a='<title>coconut</title>'; [[ "$a" =~ \<title\>(.*)\</title\> ]] && echo FOUND ${BASH_REMATCH[1]}
FOUND coconut

いいね!
Robottinosino

3

これはおそらく答えでしょう:

ダーウィンのデフォルトbash(10.8.1 / 2):

GNU bash, version 3.2.48(1)-release (x86_64-apple-darwin12)

たとえば、Ubuntu 12 LTSのデフォルトbash:

GNU bash, version 4.2.24(1)-release (x86_64-pc-linux-gnu)

それは、ポータブル新しいバッシュ癖から離れステッピングとのようなものを使用することになり作りsedawk、その他もろもろ。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.