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

관련 정보