Forum: Ruby Replacing single quotes and backslashes in strings

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
55f28e9c77b35b1539af6be60986b0e4?d=identicon&s=25 Phil Rhoades (Guest)
on 2005-12-20 10:17
(Received via mailing list)
People,

I have been trying to find a solution to this on the net but with no
luck:

I want to get a list of file names from a dir and pass the result to a
du command eg:

	puts `du file_name`

but if the filename has single quotes or backslashes in it eg:

	puts `du phil'sfile_name`    or:    puts `du phil\sfile_name`

I have replace them with eg:

	puts `du phil\'sfile_name`    or:    puts `du phil\\sfile_name`

I have tried all sorts of combinations with gsub with no success . .

Is there a solution with gsub or something else?

Thanks,

Phil.
--
Philip Rhoades

Pricom Pty Limited  (ACN 003 252 275  ABN 91 003 252 275)
GPO Box 3411
Sydney NSW	2001
Australia
Mobile:  +61:(0)411-185-652
Fax:     +61:(0)2-8221-9599
E-mail:  phil@pricom.com.au
E34b5cae57e0dd170114dba444e37852?d=identicon&s=25 Logan Capaldo (Guest)
on 2005-12-20 11:05
(Received via mailing list)
On Dec 20, 2005, at 4:15 AM, Phil Rhoades wrote:

> but if the filename has single quotes or backslashes in it eg:
>
> Mobile:  +61:(0)411-185-652
> Fax:     +61:(0)2-8221-9599
> E-mail:  phil@pricom.com.au
>

str = %q{du phil'sfile_name}
puts `#{str.gsub(/['\\]/) { |meta_char| case meta_char; when "\\"; "\\
\\"; when "'"; "\\'"; end }}`
55f28e9c77b35b1539af6be60986b0e4?d=identicon&s=25 Philip Rhoades (Guest)
on 2005-12-20 11:41
(Received via mailing list)
Logan,

On Tue, 2005-12-20 at 19:02 +0900, Logan Capaldo wrote:
> > 	puts `du file_name`
> >
> > Sydney NSW	2001
> > Australia
> > Mobile:  +61:(0)411-185-652
> > Fax:     +61:(0)2-8221-9599
> > E-mail:  phil@pricom.com.au
>
>
> str = %q{du phil'sfile_name}
> puts `#{str.gsub(/['\\]/) { |meta_char| case meta_char; when "\\"; "\\
> \\"; when "'"; "\\'"; end }}`


Whew!

Why doesn't this work?:


line = line.gsub( /'/ ', "\'" )
line = line.gsub( '\\', "\\\\" )
puts `du #{line}`


Thanks,

Phil.
--
Philip Rhoades

Pricom Pty Limited  (ACN 003 252 275  ABN 91 003 252 275)
GPO Box 3411
Sydney NSW      2001
Australia
Mobile:  +61:(0)411-185-652
Fax:     +61:(0)2-8221-9599
E-mail:  phil@pricom.com.au
E34b5cae57e0dd170114dba444e37852?d=identicon&s=25 Logan Capaldo (Guest)
on 2005-12-20 12:27
(Received via mailing list)
On Dec 20, 2005, at 5:41 AM, Philip Rhoades wrote:

>>> I want to get a list of file names from a dir and pass the result
>>> 	puts `du phil\'sfile_name`    or:    puts `du phil\\sfile_name`
>>>
>> puts `#{str.gsub(/['\\]/) { |meta_char| case meta_char; when "\\";
> line = line.gsub( '\\', "\\\\" )
> GPO Box 3411
> Sydney NSW      2001
> Australia
> Mobile:  +61:(0)411-185-652
> Fax:     +61:(0)2-8221-9599
> E-mail:  phil@pricom.com.au
>
>
>

Well, since `` invokes your shell you have to sort of "double-escape"
the meta characters of single quotes. For instance with single quotes
if you escape it once just for ruby, its not escaped for the shell so
it may try to quote with single quotes instead of  considering the
single quote part of the file name. line.gsub('\\', "\\\\") should
work but you have to be a little more careful with quotes. eg.
line.gsub(/'/, "\\'"). My code was meant to be extra-smart about the
escaping. You don't want to "over-escape" either.
This topic is locked and can not be replied to.