2017-07-05 27 views
2

NICが設定されているかどうかを検出しようとしています。 (Ubuntu 1604のため、メインコンフィギュレーションファイルは/etc/network/interfacesになります)。Linux bash:正規表現エラーのあるgrep

私はインタフェースからのconfigureを検索する正規表現を作成し、以下のようなファイル:

^[ \t]*(auto|iface|mapping|allow-.*)[ \t]+eth0 

私は直接のgrepコマンドにそれを置くと、この正規表現は動作します。しかし、私は、その後のgrepでそれを使用する変数には、この正規表現を入れて、その後のgrepは、エラーがスローされます場合:

grep: Invalid regular expression 

することはあなたはそれが変数にそのプット正規表現を動作しないことを置く理由を把握するために助けてくださいことはできますか?

ありがとうございます!

OS Sierra端末に
[email protected]:/home/lisa# mainfn=/etc/network/interfaces 
[email protected]:/home/lisa# nic_name=eth0 
[email protected]:/home/lisa# pattern="^[ \t]*(auto|iface|mapping|allow-.*)[ \t]+$nic_name" 
[email protected]:/home/lisa# echo $pattern 
^[ \t]*(auto|iface|mapping|allow-.*)[ \t]+eth0 


[email protected]:/home/lisa# grep -E "^[ \t]*(auto|iface|mapping|allow-.*)[ \t]+eth0" $mainfn 
auto eth0 
iface eth0 inet dhcp 

[email protected]:/home/lisa# grep -E $pattern $mainfn 
grep: Invalid regular expression 
+2

なぜ2番目のバージョンで引用符を削除しましたか? – melpomene

+1

これが原因であるかどうかは分かりませんが、 'grep -E'に直接入れるときは、引用符で囲まれたパターンがありますが、' $ pattern'を使用するときは引用符が付きません。編集:私はちょうどそれを試したが、私はどちらかの構文エラーを取得していないが、 'grep -E" $ pattern "$ mainfn'を試してください – Piccolo

+0

引用符が見つからないときは、(無効な)正規表現'^[ '\ t] * ...'という名前のファイルにあります。引用符をつけてください。 –

答えて

1

、あなたの例では、わずかに異なるエラーメッセージが得られます。

> grep -E $pattern filename 
grep: brackets ([ ]) not balanced 

をしかし、私は引用符で囲まれたパターンをラップする場合、それは正常に動作します:

> grep -E "$pattern" filename 
auto eth0 
iface eth0 inet dhcp 

問題引用符を付けないと、のスペースが引数の間の区切り文字として解釈されています。

言い換えれば
grep -E ^[ \t]*(auto|iface|mapping|allow-.*)[ \t]+eth0 filename 
     ^HERE       ^(and also here) 

、(アンバランスブラケットと、それゆえ私のエラーメッセージ)、無効な正規表現^[ 3つのファイル内を検索しようとしている:"\t]*(auto|iface|mapping|allow-.*)[""\t]+eth0"(明らかに存在しない)、および"filename"bashでの一般的なルールとして


、そのような空白の問題を回避するために、次のように引用符で囲まれた変数のいずれか使用をラップすることをお勧めします。