awkを使用して単純な規則に従ってソースファイルをインデントする方法は?

awkを使用して単純な規則に従ってソースファイルをインデントする方法は?

いくつかの簡単なルールに従ってソースコードをインデントする方法は?

たとえば、私はsedを使用しており、セレンHTMLソーステーブルを次のrspecに似たコードに変換するように要求しました。describeとの間の行を一貫してインデントするにはどうすればよいですかend?理想的にはインデントを追加したいです。

describe "Landing" do
visit("http://some_url/url_reset")
visit("http://some_url/url_3_step_minimal_foundation")
# comments
expect(css_vehicle1_auto_year) to be_visible
end
describe "Stage1" do
wait_for_element_present(css_vehicle1_auto_year option_auto_year)
select(auto_year, from: css_vehicle1_auto_year)
...
end
describe "Stage2" do
fill_in(css_driver1_first_name, with: driver1_first_name)
fill_in(css_driver1_last_name, with: driver1_last_name)
...
submit(css_policy_form)
expect(css_vehicle1_coverage_type) to be_visible
end
describe "Stage3" do
wait_for_element_present(css_vehicle1_coverage_type)
select(coverage_type, from: css_vehicle1_coverage_type)
find(css_has_auto_insurance).click
...
submit(css_policy_form)
expect(css_quotes) to be_visible
end

だから私は持っています

describe "Landing" do
  visit("http://some_url/url_reset")
  visit("http://some_url/url_3_step_minimal_foundation")
  # comments
  expect(css_vehicle1_auto_year) to be_visible
end
describe "Stage1" do
  wait_for_element_present(css_vehicle1_auto_year option_auto_year)
  select(auto_year, from: css_vehicle1_auto_year)
  ...
end
describe "Stage2" do
  fill_in(css_driver1_first_name, with: driver1_first_name)
  fill_in(css_driver1_last_name, with: driver1_last_name)
  ...
  submit(css_policy_form)
  expect(css_vehicle1_coverage_type) to be_visible
end
describe "Stage3" do
  wait_for_element_present(css_vehicle1_coverage_type)
  select(coverage_type, from: css_vehicle1_coverage_type)
  find(css_has_auto_insurance).click
  ...
  submit(css_policy_form)
  expect(css_quotes) to be_visible
end

既存のsedとawkのソースコードは次の場所にあります。https://jsfiddle.net/4gbj5mh4/しかし、本当に混乱していて、私が尋ねるものではありません。私は単純なsedとawkに慣れましたが、どこから始めるべきかわかりません。

再帰も処理できればよさそうです。私にとっては重要ではありませんが、一般化はこの質問を使用している他の人に役立ちます。

describe "a" do
describe "b" do
stuff
more stuff
end
end

到着

describe "a" do
  describe "b" do
    stuff
    more stuff
  end
end

ところで、私もこのカスタム変換を行っています。部分的には、変数をセレンのページオブジェクトとして使用しており、rspecへの組み込みエクスポートをブロックしているためです。

ベストアンサー1

そしてawk

awk '
  /^end/ { sub("  ", "", indent) } # Or { indent = substr(indent, 3) }
  { print indent $0 }
  /^describe/ { indent = indent"  " }
' <file

おすすめ記事