grepで実行する必要がある正規表現を作成しました。オンライン正規表現ツールと連携して動作するので、正規表現は大丈夫だと確信していますが、実行すると
grep -r -P -o -h '(?<=(?<!def )my_method )(["'])(?:(?=(\\?))\2.)*?\1'
エラーが発生しましたSyntax error: ")" unexpected
。
答え1
正規表現は一重引用符で囲まれていますが、含むアポストロフィ。
一重引用符は["']
エスケープする必要があります。それ以外の場合は、引用符付き文字列の終わりをシェルに通知します。
これにより問題が解決します。
grep -r -P -o -h '(?<=(?<!def )my_method )(["'\''])(?:(?=(\\?))\2.)*?\1'
# ^^^^
を使用すると、["'\'']
最初の部分はリテラル一重引用符を挿入して文字列'
の最初の部分を終了し\'
、最後の部分は'
古いビットに関連付けられる新しい一重引用符文字列を開始します。中央の一重引用符のみが正規表現自体に表示され、残りの2つの一重引用符はシェルから削除されます。
答え2
@Kusalanandaへ説明した、問題は'
正規表現にあります。簡単な解決策は"
正規表現を使用することです。引用符付き文字列内でエスケープしないのとは異なり、引用符付き文字列内でもエスケープ"
が可能です。"
'
'
grep -rPoh "(?<=(?<!def )my_method )([\"'])(?:(?=(\\?))\2.)*?\1"