Skip to content

Instantly share code, notes, and snippets.

/ruby.rb Secret

Created January 27, 2016 02:49
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save anonymous/8c5d463e0b10052d6f30 to your computer and use it in GitHub Desktop.
Save anonymous/8c5d463e0b10052d6f30 to your computer and use it in GitHub Desktop.
irb(main):052:0> options="from='10.1.1.42,10.1.1.41',no-port-forwarding,no-x11-forwarding,no-agent-forwarding"
=> "from='10.1.1.42,10.1.1.41',no-port-forwarding,no-x11-forwarding,no-agent-forwarding"
irb(main):053:0> options.parse_csv
=> ["from='10.1.1.42", "10.1.1.41'", "no-port-forwarding", "no-x11-forwarding", "no-agent-forwarding"]
@grigarr
Copy link

grigarr commented Jan 27, 2016

options='from="10.1.1.42,10.1.1.41",no-port-forwarding,no-x11-forwarding,no-agent-forwarding'

after parsing should return something like

options_arr[0] = from="10.1.1.42,10.1.1.41"
options_arr[1] = no-port-forwarding
options_arr[2] = no-x11-forwarding
options_arr[3] = no-agent-forwarding

@grigarr
Copy link

grigarr commented Jan 27, 2016

irb(main):056:0> options.shellsplit
=> ["from=10.1.1.42,10.1.1.41,no-port-forwarding,no-x11-forwarding,no-agent-forwarding"]

@grigarr
Copy link

grigarr commented Jan 27, 2016

#!/usr/bin/env ruby

def shellsplittest(line)
  words = []
  field = ''
  line.scan(/\G\,*(?>([^\,\\\'\"]+)|'([^\']*)'|"((?:[^\"\\]|\\.)*)"|(\\.?)|(\S))(\,|\z)?/m) do
    |word, sq, dq, esc, garbage, sep|
    raise ArgumentError, "Unmatched double quote: #{line.inspect}" if garbage
    field << (word || sq || (dq || esc).gsub(/\\(.)/, '\\1'))
    if sep
      words << field
      field = ''
    end
  end
  print words
end

options='from="10.1.1.42,10.1.1.41",no-port-forwarding,no-x11-forwarding,no-agent-forwarding'

shellsplittest(options)

["from=10.1.1.42,10.1.1.41", "no-port-forwarding", "no-x11-forwarding", "no-agent-forwarding"]

@grigarr
Copy link

grigarr commented Jan 27, 2016

def shellsplittest(line)
  words = []
  field = ''
  line.scan(/\G\,*(?>([^\,\\\'\"]+)|'([^\']*)'|("(?:[^\"\\]|\\.)*")|(\\.?)|(\S))(\,|\z)?/m) do
    |word, sq, dq, esc, garbage, sep|
    raise ArgumentError, "Unmatched double quote: #{line.inspect}" if garbage
    field << (word || sq || dq || esc.gsub(/\\(.)/, '\\1'))
    field.gsub(/\\=/,'\\=\"')
    if sep
      words << field
      field = ''
    end
  end
  print words
end

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment