grepで角かっこを一致させ除外したいbashイベントが見つかりません。

grepで角かっこを一致させ除外したいbashイベントが見つかりません。

長い文章でまとめます。

(foo),(bar,baz(word,right),(end)

私は印刷したいだけです:

      (bar,baz(word,right

2番目の角かっこを一致させるために、入らないようにする3番目の単語に続く単語:

$ grep -oP "\\(.*(?!word).*right"

しかし、Bashは感嘆符を説明します。

-bash: !word: イベントが見つかりません

感嘆符の保護アポストロフィ失敗したgrep: missing )

$ grep -oP '\\(.*(?!word).*right'
$ grep -oP '\\((?!word)(.*right)'

感嘆符の保護バックスラッシュ失敗したgrep: unrecognized character after (? or (?-

どんなアイデアがありますか?

注:-PPerl正規表現の場合、-o行の一致部分のみが印刷されます。

ベストアンサー1

一重引用符と二重引用符の規則は異なります。

表示された理由で感嘆符をエスケープするための合理的な方法がないため、bashは二重引用符を確実に使用できません。

$ grep -oP "\\(.*(?!word).*right"
bash: !word: event not found

$ grep -oP "\\(.*(?\!word).*right"
grep: unrecognized character after (? or (?-

2つ目はbashがgrepの\!代わりに渡すからです!。これを見せてください:

$ printf '%s' "\!"
\!

一重引用符を使用しようとすると、二重バックスラッシュはエスケープされたバックスラッシュを意味するのではなく、2つのバックスラッシュを意味します。

$ printf '%s' '\\(.*(?!word).*right'
\\(.*(?!word).*right

一重引用符内では、すべてが文字通りエスケープされていないため、試したい正規表現を作成する方法は次のとおりです。

$ grep -oP '\(.*(?!word).*right'

おすすめ記事