Aqui está uma maneira com sed
:
sed -E '/with_ajax_wait/,/end/{ # if line is in this range
H # append to hold space
/end/!d # if it doesn't match end, delete it
//{ # if it matches
s/.*// # empty the pattern space
x # exchange pattern space w. hold space
s/^(\n)( *)/it "waits" do/ # add first line + initial spacing
s/\n/& /g # re-indent all other lines
G # append hold space to pattern space
s/^(( *).*)/do/ # add the closing 'do' + initial spacing
}
}
' infile
então com uma entrada como:
with_ajax_wait
expect(css_coverage_type_everquote).to be_visible
end
find(css_policy_form_stage3).click
with_ajax_wait
expect(css_coverage_type_everquote).to be_visible
end
something here
with_ajax_wait
expect(css_coverage_type_everquote).to be_visible
got some more stuff here to do
process it
done
end
end
a saída é:
it "waits" do
with_ajax_wait
expect(css_coverage_type_everquote).to be_visible
end
do
find(css_policy_form_stage3).click
it "waits" do
with_ajax_wait
expect(css_coverage_type_everquote).to be_visible
end
do
something here
it "waits" do
with_ajax_wait
expect(css_coverage_type_everquote).to be_visible
got some more stuff here to do
process it
done
end
do
end
Ele deve funcionar com blocos de mais de três linhas, desde que seus blocos with_ajax_wait
sempre terminem com end
.
Substitua o do
de fechamento por end
, se necessário, pois seu exemplo é confuso ... (você usou end
para o primeiro bloco e do
para o segundo). desta vez usando BRE
e [[:blank:]]
em vez de (espaço):
sed '/with_ajax_wait/,/end/{
/with_ajax_wait/{
G
s/\([[:blank:]]*\)\(with_ajax_wait\)\(\n\)/it "waits" do /
p
d
}
//!{
/end/!{
s/^/ /
}
/end/{
G
s/\([[:blank:]]*\)\(end\)\(\n\)/ end/
}
}
}
' infile
Este está processando cada linha nesse intervalo separadamente, o primeiro e o último no intervalo são re-indentados e wrappers são adicionados, o resto das linhas são apenas re-indentados.