長い文章でまとめます。
(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 (?-
どんなアイデアがありますか?
注:-P
Perl正規表現の場合、-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'