web-dev-qa-db-ja.com

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

これは正常に機能します。

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 `('

\'を使用して一重引用符をエスケープしています。

テキストに#があるため、通常の/区切り文字の代わりに/を区切り文字として使用していることに注意してください。

3
Michael Durrant

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

  • 一重引用符で囲まれた文字列を終了し、エスケープされた(円記号または二重引用符で)一重引用符を追加して、文字列の次の部分をすぐに開始します。

    $ echo 'foo'\''bar' 'foo'"'"'bar'
    foo'bar foo'bar
    
  • 文字列には二重引用符を使用します。

    $ echo "foo'bar"
    foo'bar
    

    もちろん、これは、シェルによって二重引用符で囲まれて展開されるものに注意する必要があることを意味します。

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

10
peterph

その構文エラーはエスケープされていない正規表現を暗示しているようです。私は個人的にsedをあまり使用しませんが、正しく覚えていれば、括弧などをエスケープする必要があります(二重引用符を使用している場合は、二重の円記号を使用します)。 エスケープする必要がある可能性のある文字のリストは次のとおりです...

1
Frostyfrog