一重引用符をエスケープする方法は? [コピー]

一重引用符をエスケープする方法は? [コピー]

これはうまくいきます:

sed -i 's#    @driver.find_element(:xpath, "//a\[contains(@href,##' temp_spec.rb

ソースをターゲティングする

@driver.find_element(:xpath, "//a[contains(@href,'change_district')]").click

私に残ったものは次のとおりです。

'change_district')]").click`

しかし、最後に一重引用符を追加しようとすると失敗します。

sed -i 's#    @driver.find_element(:xpath, "//a\[contains(@href,\'##' temp_spec.rb

syntax error near unexpected token `('

私は\'一重引用符をエスケープするために使用します。

テキストでは、#通常の区切り文字ではなくaを区切り文字として使用していることに注意してください。//

答え1

一重引用符内の文字列はシェルで文字通り使用されます(したがって、ペアの閉じた一重引用符として扱われるため、他の一重引用符を含めることはできません)。つまり、いくつかのオプションがあります。

  • 一重引用符で囲まれた文字列を終了し、エスケープされた(バックスラッシュまたは二重引用符で)一重引用符を追加してから、文字列の次の部分をすぐに開始します。

    $ echo 'foo'\''bar' 'foo'"'"'bar'
    foo'bar foo'bar
    
  • 文字列には二重引用符を使用してください。

    $ echo "foo'bar"
    foo'bar
    

    これはもちろん、シェルが二重引用符内で拡張されることに注意する必要があることを意味します。

  • 理解\xHHまたはエスケープ\0nnnするユーティリティ(GNU sedが実行する)を使用している場合は、次のいずれかを使用できます(ASCII単一引用符はコードポイント39(0x27)にあるため、たとえば\x27)。

答え2

構文エラーは、エスケープされていない正規表現を暗示するようです。私は個人的にsedをあまり頻繁に使用しませんが、私の記憶が正しい場合は括弧(または二重引用符を使用する場合は二重バックスラッシュ)などの項目もエスケープする必要があります。以下は、エスケープする必要がある文字のリストです。

関連情報