Linux обычно делает интенсивное использование файловой системы и делает обновления метаданных каждый раз, когда файл читается - т.е. существует последовательная запись для каждого доступа к файлу.
Это не корректно. Более точный: Это не было значением по умолчанию больше в течение многих лет. Значение по умолчанию - то, что время доступа обновляется, только если это более старое, чем mtime или ctime или более старым, чем 24 часа. Обновление atime может быть отключено полностью опцией монтирования noatime
.
Если необходимо завершить работу действительно быстро затем, необходимо определить, какие шаги занимают много времени и сразу уничтожают эти процессы (-SIGKILL). Другие должны получить-SIGTERM и одну или две секунды спустя-SIGKILL, также. Затем ядро должно смочь закрыть файловые системы очень скоро.
Вот один способом с 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
Он обрабатывает каждую строку в этом диапазоне отдельно, первую и последние строки в диапазоне изменяются с повторным отступом и добавляются обертки, остальные строки просто меняются с повторным отступом.
Попробуйте следующий 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
всегда отступают на два пробела, даже если текст внутри отступает более или менее. Вероятно, это легче исправить за счет более сложной команды. У меня это сработало с 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
печатает все строки.