How to add single quotes across a string in ruby? - ruby

I am iterating over a config.yml from from which parsing the values in a string form as follows:
machines:
A:
ip: 10.11.12
pass: vass
B:
ip: 10.11.13
pass: grass
The above config.yml is parsed as follows:
machines = YAML.load_file('machine.yml')
var=''
machines[A].each do |letters,hash|
var += "[" + hash['ip'] + "]\n" + hash['pass'] + "\n"
end
The "var" value i am getting as :
"[10.11.12]\nvass\n[10.11.13]\ngrass\n"
but instead like above i dont want double quotes rather single quotes across complete atring as follows:
'[10.11.12]\nvass\n[10.11.13]\ngrass\n'
So, please suggest how can have single quotes across the string.

Generally the puts will print the value of the string without double quotes in the console.
So may be you can use puts var so that double quotes are not getting printed. And now you can wrap your content with single quote using string interpolation.
var += "'#{actual_value}'"

Related

How can I print double quotes in ruby

Am trying to bring output like below in AWS console for Cloudwatch metric filter pattern
[w1,w2,w3,w4=!"*10.1.1.1*"&&w5=!"*10.1.1.2*"&&w5="*admin*"]
for one of my ruby aws sdk script with below function
data_of_ips = ["10.1.1.1", "10.1.1.2"]
def run_me(data_of_ips)
:::
:::
filter_pattern = '[w1,w2,w3,w4!='"*#{data_of_ips[0]*"'&&w4!='"*#{data_of_ips[1]*"',w5="*admin*"]'
but in the aws console output I could see the output like below without " (double quotes) for w4.
[w1,w2,w3,w4=!*10.1.1.1*&&w4=!*10.1.1.2*&&w5="*admin*"]
Please help me out to fix this.
Is this what you expect?
data_of_ips = ["10.1.1.1", "10.1.1.2"]
def run_me(data_of_ips)
"[w1,w2,w3,w4!=\"*#{data_of_ips[0]}*\"&&w4!=\"*#{data_of_ips[1]}*\"&&w5=\"*admin*\"]"
end
puts run_me(data_of_ips)
# => [w1,w2,w3,w4!='"*10.1.1.1*"&&w4!="*10.1.1.2*"&&w5="*admin*"]
If you want to put variable or script inside a string, I suggest you can use double quote with #{} to do that. It's more clear. And the special char like " you can just use \" to write them.
I fixed it this way:
filter_pattern = '[w1,w2,w3,w4!="'"*#{data_of_ips[0]}*"'"&&w4!="'"*#{data_of_ips[1]}*"'"w5="*admin"]'
I used "'" (double-quotes single-quote double-quotes) and got the expected output below:
filter_pattern = '[w1,w2,w3,w4!="*10.1.1.1*"&&w4!="*10.1.1.2*",w5"*admin*"]'

ruby on rails replace single-quotes with double-quote in a string

I am trying to replace a single-quote with double quotes inside a string, as following:
current_res = 25
lowest_res = 15
str = "The result of the child is '#{current_res}' and the lowest grade is '#{lowest_res }'."
I need the output to look like:
str = The result of the child is "25" and the lowest grade is "15".
I tried different method using gsub but nothing work so far. Any ideas?
If that's the only case you're covering where you need to show some output in double quoted string then. How about something simple like following
str = "The result of the child is \"#{current_res}\" and the lowest grade is \"#{lowest_res }\" ."
You can escape quotes in double quoted strings.

regex replace [ with \[

I want to write a regex in Ruby that will add a backslash prior to any open square brackets.
str = "my.name[0].hello.line[2]"
out = str.gsub(/\[/,"\\[")
# desired out = "my.name\[0].hello.line\[2]"
I've tried multiple combinations of backslashes in the substitution string and can't get it to leave a single backslash.
You don't need a regular expression here.
str = "my.name[0].hello.line[2]"
puts str.gsub('[', '\[')
# my.name\[0].hello.line\[2]
I tried your code and it worked correct:
str = "my.name[0].hello.line[2]"
out = str.gsub(/\[/,"\\[")
puts out #my.name\[0].hello.line\[2]
If you replace putswith p you get the inspect-version of the string:
p out #"my.name\\[0].hello.line\\[2]"
Please see the " and the masked \. Maybe you saw this result.
As Daniel already answered: You can also define the string with ' and don't need to mask the values.

Escaping single and double quotes in a string in ruby?

How can I escape single and double quotes in a string?
I want to escape single and double quotes together. I know how to pass them separately but don't know how to pass both of them.
e.g: str = "ruby 'on rails" " = ruby 'on rails"
My preferred way is to not worry about escaping and instead use %q, which behaves like a single-quote string (no interpolation or character escaping), or %Q for double quoted string behavior:
str = %q[ruby 'on rails" ] # like single-quoting
str2 = %Q[quoting with #{str}] # like double-quoting: will insert variable
See https://docs.ruby-lang.org/en/trunk/syntax/literals_rdoc.html#label-Strings and search for % strings.
Use backslash to escape characters
str = "ruby \'on rails\" "
Here is a complete list:
From http://learnrubythehardway.org/book/ex10.html
You can use Q strings which allow you to use any delimiter you like:
str = %Q|ruby 'on rails" " = ruby 'on rails|
>> str = "ruby 'on rails\" \" = ruby 'on rails"
=> "ruby 'on rails" " = ruby 'on rails"
I would go with a heredoc if I'm starting to have to worry about escaping. It will take care of it for you:
string = <<MARKER
I don't have to "worry" about escaping!!'"!!
MARKER
MARKER delineates the start/end of the string. start string on the next line after opening the heredoc, then end the string by using the delineator again on it's own line.
This does all the escaping needed and converts to a double quoted string:
string
=> "I don't have to \"worry\" about escaping!!'\"!!\n"
I would use just:
str = %(ruby 'on rails ")
Because just % stands for double quotes(or %Q) and allows interpolation of variables on the string.
Here is an example of how to use %Q[] in a more complex scenario:
%Q[
<meta property="og:title" content="#{#title}" />
<meta property="og:description" content="#{#fullname}'s profile. #{#fullname}'s location, ranking, outcomes, and more." />
].html_safe
One caveat:
Using %Q[] and %q[] for string comparisons is not intuitively safe.
For example, if you load something meant to signify something empty, like "" or '', you need to use the actual escape sequences. For example, let's say qvar equals "" instead of any empty string.
This will evaluate to false
if qvar == "%Q[]"
As will this,
if qvar == %Q[]
While this will evaluate to true
if qvar == "\"\""
I ran into this issue when sending command-line vars from a different stack to my ruby script. Only Gabriel Augusto's answer worked for me.

Ruby replace text within single quotes or backticks for html tag

Hello I am trying to build a simple action in Ruby that takes one string like
result = "This is my javascript variable 'var first = 1 + 1;' and here is another 'var second = 2 + 2;' and that's it!"
So basically I would like to take the text within single quotes ' or backticks ` and and replace it by:
<code>original text</code> note I'm replacing it by an opening and closing code tag
Just like in markdown
so I would have a result like
result = "This is my javascript variable <code>var first = 1 + 1;<code> and here is another <code>var second = 2 + 2;</code> and that's it"
If it's possible to run this natively without the need of any extra gem it would be great :)
Thanks a lot
I guess you'll need to iterate the string and parse it. While you can do non-greedy regex matches, e.g. result.gsub!(/'([^']*)'/, '<code>\1</code>') you might find the result might not behave correctly in corner-cases.
Without any other advanced requirement
>> result.gsub(/\s+'/,"<code>").gsub(/'\s+/,"</code>")
=> "This is my javascript variable<code>var first = 1 + 1;</code>and here is another<code>var second = 2 + 2;</code>and that's it!"
You will need to come-up with a character as a delimiter for your code, which you don't use otherwise..
Why? because of all the corner cases. E.g. the following string
result = "This's my javascript variable 'var first = 1 + 1;' and here is another 'var second = 2 + 2;' and that's it!"
which would otherwise produce:
"This<code>s my javascript variable </code>var first = 1 + 1;<code> and here is another </code>var second = 2 + 2;<code> and that</code>s it!"
Total garbage out..
However if you use a unique character as a delimiter that's otherwise not used, you can create a non-greedy RegExp which will do the search/replace
e.g. using a # character to delimit the code:
"This's my javascript variable #var first = 1 + 1;# and here is another #var second = 2 + 2;# and that's it!"

Resources