On Sat, Aug 25, 2012 at 11:51 AM, Sean O'Halpin <[email protected]> wrote:
> On Sat, Aug 25, 2012 at 12:57 AM, David Jacobs <[email protected]> wrote:
>> How can I parse filenames read from STDIN via the standard Unix parsing 
>> rules (without duplicating said rules)? All of the following would be parsed 
>> as coherent file names:
>>
>> file.txt
>> my\ file.txt
>> "my file.txt"
>>
>> A nice addition would be that *.txt would use Bash expansion to find the 
>> appropriate files.
>
> Use Shellwords to handle shell escaped strings and Dir[] to expand wildcards:
>
> require 'shellwords'
> while line = STDIN.gets
>   filename = Shellwords.shellwords(line).join('')
>   p filename
>   # expand wildcards
>   p Dir[filename]
> end

Two additional cents:

1. I'd rather use $stdin instead of STDIN, see here for reasoning:
http://stackoverflow.com/questions/4279604/what-is-the-difference-between-stdin-and-stdin-in-ruby

2. One can as well use the usual iteration for reading lines from files.

=>

require 'shellwords'

$stdin.each_line do |line|
  filename = Shellwords.shellwords(line).join('')
  p filename
  # expand wildcards
  p Dir[filename]
end

Advantage is also that the scope of "line" is limited to the block
reducing potential for errors.

Btw, Sean, are you sure David will join all the shellwords?  I am
asking since he said there were commands as well and he basically
wants to parse in the same way the shell does.  So:

irb(main):006:0> ['my\\ file.txt', '"my file.txt"', 'ls foo\\
bar.txt'].each {|s| printf "%p -> %p\n", s, Shellwords.shellwords(s)}
"my\\ file.txt" -> ["my file.txt"]
"\"my file.txt\"" -> ["my file.txt"]
"ls foo\\ bar.txt" -> ["ls", "foo bar.txt"]
=> ["my\\ file.txt", "\"my file.txt\"", "ls foo\\ bar.txt"]


Kind regards

robert

-- 
remember.guy do |as, often| as.you_can - without end
http://blog.rubybestpractices.com/

-- You received this message because you are subscribed to the Google Groups 
ruby-talk-google group. To post to this group, send email to 
[email protected]. To unsubscribe from this group, send email 
to [email protected]. For more options, visit this 
group at https://groups.google.com/d/forum/ruby-talk-google?hl=en

Reply via email to