Как добавить «оболочки» к методам в исходном коде на основе шаблона, используя sed, awk, grep и их друзей

Linux обычно делает интенсивное использование файловой системы и делает обновления метаданных каждый раз, когда файл читается - т.е. существует последовательная запись для каждого доступа к файлу.

Это не корректно. Более точный: Это не было значением по умолчанию больше в течение многих лет. Значение по умолчанию - то, что время доступа обновляется, только если это более старое, чем mtime или ctime или более старым, чем 24 часа. Обновление atime может быть отключено полностью опцией монтирования noatime.

Если необходимо завершить работу действительно быстро затем, необходимо определить, какие шаги занимают много времени и сразу уничтожают эти процессы (-SIGKILL). Другие должны получить-SIGTERM и одну или две секунды спустя-SIGKILL, также. Затем ядро должно смочь закрыть файловые системы очень скоро.

2
13.04.2017, 15:37
3 ответа

Вот один способом с 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)( *)/\2it "waits" do\1\2/      # add first line + initial spacing
s/\n/&  /g                            # re-indent all other lines
G                                     # append hold space to pattern space
s/^(( *).*)/\1\2do/                   # add the closing 'do' + initial spacing
}
}
' infile

поэтому с вводом вида:

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

вывод будет:

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

Он должен работать с блоками из более чем трех строк, если ваши блоки with_ajax_wait всегда оканчивается концом .
Замените закрывающую do на end , если необходимо, поскольку ваш пример сбивает с толку ... (вы использовали end для первого блока и do для второго) например на этот раз с использованием BRE и [[: blank:]] вместо (пробел):

sed '/with_ajax_wait/,/end/{
/with_ajax_wait/{
G
s/\([[:blank:]]*\)\(with_ajax_wait\)\(\n\)/\1it "waits" do\3  \1\2/
p
d
}
//!{
/end/!{
s/^/  /
}
/end/{
G
s/\([[:blank:]]*\)\(end\)\(\n\)/  \1\2\3\1end/
}
}
}
' infile

Он обрабатывает каждую строку в этом диапазоне отдельно, первую и последние строки в диапазоне изменяются с повторным отступом и добавляются обертки, остальные строки просто меняются с повторным отступом.

1
27.01.2020, 22:05

Попробуйте следующий SED:

sed '/with_ajax_wait/{/end/!N;N;s/^/  it \"waits\" do\n/;s/$/\nend/;s/\n/\n  /g}'

Это работает для приведенного вами примера.

Версия Mac OS

(Проверено на OS X 10.8.5) Mac OS не любит определенные строки или цепочки команд вместе с точкой с запятой. Вместо этого используйте следующее:

sed -E -e '/with_ajax_wait/{' -e '/end/!N' -e 'N' -e 's/^/  it \"waits\" do\
/' -e 's/$/\
end/' -e 's/\n/\
  /g' -e '}'

Это буквально новые строки, которые можно вводить в терминале или копировать.

Как это работает

Ключом является команда N. Мы хотим заполнить память SED (пространство шаблона N) группой формы

  with_ajax_wait
    // commands
  end

Программа обходит файл строкой за раз, пока не достигнет соответствия строки с_ajax_wait; затем выполняет команду N, которая добавляет к пространству шаблона больше строк, пока не достигнет соответствия строки концу . Остальная часть программы представляет собой последовательность замен, которая выполняет обёртку: мы добавляем строку , которая "ждёт" линии do к началу блока, строку do к концу, а затем мы делаем отступ от всего.

Ограничения

  • Это не сработает, если слово end встречается в любом месте внутри блока с_ajax_wait ... end. Чтобы это сработало, потребуется более серьезный разбор самого кода. Если мы можем гарантировать, что закрывающий end всегда будет смещен на два пробела, то мы можем сделать этот SED немного лучше, заменив {/end/!N на {/\n end/!N или что-нибудь в этом роде.
  • Команды it "waitits" do и do всегда отступают на два пробела, даже если текст внутри отступает более или менее. Вероятно, это легче исправить за счет более сложной команды.
1
27.01.2020, 22:05

У меня это сработало с awk :

awk '/with_ajax_wait/,/end/{          # match the lines between the blocks
  i=substr($0,0,match($0, "[^ ]")-1); # i contains the indented spaces
  if($0~/with_ajax_wait/){            # if it is the starting block
    $0=i"it \"waits\" do\n  "$0       # ... add the starting block before the line
  }else if($0~/end/){                 # if it is the ending block
    $0="  "$0"\n"i"end"               # ... add the end block after the line
  }else{                              # else
    $0="  "$0                         # just indent the line with 2 spaces
  }
}1' file

Объяснение в комментариях. 1 в конце всего оператора является просто истинным условием, так что awk печатает все строки.

1
27.01.2020, 22:05

Теги

Похожие вопросы