[ruby-core:99647] [Ruby master Bug#17126] String#gsub fails to escape single quote for shell
From:
merch-redmine@...
Date:
2020-08-19 17:57:10 UTC
List:
ruby-core #99647
Issue #17126 has been updated by jeremyevans0 (Jeremy Evans).
Status changed from Open to Closed
`\'` means something special in a sub/gsub replacement string, see the documentation for details: https://docs.ruby-lang.org/en/2.7.0/String.html#method-i-gsub
As the documentation explains, use four backslashes:
```ruby
puts "Hello ' World".gsub(/'/, "'\\\\''")
# Output:
# Hello '\'' World
```
----------------------------------------
Bug #17126: String#gsub fails to escape single quote for shell
https://bugs.ruby-lang.org/issues/17126#change-87128
* Author: AndyMaleh (Andy Maleh)
* Status: Closed
* Priority: Normal
* ruby -v: 2.7.1
* Backport: 2.5: UNKNOWN, 2.6: UNKNOWN, 2.7: UNKNOWN
----------------------------------------
Hi, I don't know if I'm misunderstanding how `String#gsub` works, but I encountered an issue in the Ruby "git" gem with escaping single quotes for shell, which I fixed and [contributed back](https://github.com/ruby-git/ruby-git/pull/480).
I thought I'd report here too since it was caused by Ruby `String#gsub` malfunctioning, just in case there is a bug in Ruby.
**Description:**
When calling `String#gsub("'", "'\\''")` on a String that contains a single-quote (e.g. `"Hello ' World"`), it is duplicating the substring following the single-quote in the returned String instead of simply replacing the single-quote with escaped single quotes.
**Code to Demonstrate Problem:**
```ruby
"Hello ' World".gsub('\'', '\'\\\'\'')
```
or
```ruby
"Hello ' World".gsub("'", "'\\''")
```
or
```ruby
"Hello ' World".gsub(/'/, "'\\''")
```
**Output:**
```
=> "Hello ' World' World"
```
**Expected Output:**
```
=> "Hello '\'' World"
```
In fact, I tested this same regex replacement in Java and got the expected output above.
I look forward to hearing back about this puzzling problem.
Perhaps it is not a bug and I am just misunderstanding how `String#gsub` works in Ruby as I noticed it behaves the same exact way in JRuby too.
Best regards,
Andy Maleh
--
https://bugs.ruby-lang.org/
Unsubscribe: <mailto:[email protected]?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>