web-dev-qa-db-ja.com

Linuxシェルの「bash:予期しない ')に近い構文エラー」

Word Linuxが引用符内のどこかにある括弧の間のどこかにある引用符内の文字列を探しています。そのためには正規表現を使用する必要があります。 Linux OSで実行する必要があります(Virtual Box Terminalを使用)。次の正規表現を使用しました。

 egrep "\"([^"]*)?\(([^"]*)?Linux([^"]*)?\)([^"]*)?\"" [FILE]

しかし、問題は、私が得る

bash: syntax error near unexpected token '("

毎回。何が問題なのでしょうか?この正規表現を「 http://regexr.com/ 」で試しました。正常に動作し、正規表現に問題はありません。しかし、Linuxシェルは常に同じ問題を引き起こします...メタ文字であるため、括弧の前に「\」を使用しました。私が二重引用符の前でやったのと同じこと...しかし、それは動作しません。誰か助けてくれませんか?

2
Konstantin Pak

問題は、式の内部のエスケープされていない二重引用符です。たとえば、この部分の"]*)?\(([^]"です。二重引用符または"または()を含むリテラル[]を渡したい場合は、引用符を引用する必要があります!できる

egrep "\"([^\"]*)?\(([^\"]*)?Linux([^\"]*)?\)([^\"]*)?\"" FILE

しかし、それほどlessくない方法は、式全体を単一引用符で引用し、一般に常に強い(単一)正規表現を引用することです。これにより、シェルは、 egrepまたは使用しているプログラム:

egrep '"([^"]*)?\(([^"]*)?Linux([^"]*)?\)([^"]*)?"' FILE

(現在、外側の二重引用符をエスケープする必要はありませんが、括弧をリテラルにするために他のバックスラッシュが必要です(EREで))

行の残りが必要ない場合は、-o(一致のみ)も追加します

egrep -o '"([^"]*)?\(([^"]*)?Linux([^"]*)?\)([^"]*)?"' FILE

あなたは例を挙げなかったので、私は愚かなものを作りました...ここにあるのは前です:

what
where is "the (lost Linux that I want) to find somewhere" in this file
and some junk
we don't want this thing "here where Linux is (not in brackets)"

以降:

"the (lost Linux that I want) to find somewhere"

(注:GNU grepを使用すると、egrepを使用する代わりにgrep -Eを実行できます)

5
Zanna

最初と最後の二重引用符"を単一引用符'に置き換えます。

egrep '\"([^"]*)?\(([^"]*)?Linux([^"]*)?\)([^"]*)?\"' [FILE]
3
Thomas