Skip to content

Instantly share code, notes, and snippets.

@codeout
Last active December 19, 2017 07:07
Show Gist options
  • Save codeout/a5a47e4143c2473767a509d25ddcb036 to your computer and use it in GitHub Desktop.
Save codeout/a5a47e4143c2473767a509d25ddcb036 to your computer and use it in GitHub Desktop.
Example of junoser-squash.rb
require 'junoser'
require 'parslet'
module Junoser
module Display
class DeleteTransformer < Parslet::Transform
rule(config: simple(:config)) do
"(#{config.to_s}"
end
rule(config: sequence(:configs)) do
configs.join("\n")
end
rule(arg: simple(:arg)) do
arg
end
rule(label: simple(:label)) do
")#{Regexp.escape(label.to_s)}"
end
rule(label: simple(:label), child: simple(:child)) do
"#{Regexp.escape(label.to_s)} #{child}"
end
rule(label: simple(:label), child: sequence(:children)) do
%[#{Regexp.escape(label.to_s)} #{children.join(' ')}]
end
rule(statement: simple(:statement), argument: simple(:argument)) do
"#{statement} #{argument}"
end
rule(statement: simple(:statement), argument: sequence(:arguments)) do
%[#{statement} #{arguments.join(' ')}]
end
rule(oneline: simple(:str)) do
str
end
rule(oneline: sequence(:strs)) do
strs.join(' ')
end
end
class SetLinesWithCommands
def initialize(io)
@io = io
@lines = []
@parser = Junoser::Parser.new
@transformer = DeleteTransformer.new
end
def process
while l = $<.gets
l.strip!
case l
when /^set /
@lines << l
when /^delete /
to_delete = @parser.parse(l.gsub(/^delete /, 'set '))
delete_lines @transformer.apply(to_delete)
end
end
@lines.uniq.map(&:strip).join("\n")
end
private
def delete_lines(pattern)
@lines.each do |l|
l.sub!(/#{pattern}/) { $1 }
end
end
end
end
end
lines = Junoser::Display::SetLinesWithCommands.new($<)
puts lines.process
@codeout
Copy link
Author

codeout commented Dec 18, 2017

実行例

入力ファイル (config)

set interfaces em0 unit 0 family inet address 1.1.1.1/32
set interfaces em0 unit 1 family inet address 1.1.1.2/32
delete interfaces em0 unit 0 family inet address 1.1.1.1/32

出力例

junoser $ ruby junoser-squash.rb config
set interfaces em0 unit 0 family inet
set interfaces em0 unit 1 family inet address 1.1.1.2/32

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