don_crissti e terdon fizeram todo o trabalho duro; Eu vi essa pergunta e queria sugerir o uso de uma função shell para reduzir ainda mais a digitação / memorização e, talvez, adicionar alguma flexibilidade. Ao digitá-lo, também tomei a liberdade de apertar a expressão regular alguns, para evitar falsos positivos.
Aqui está a função do shell:
function step () (
STEPS=./steps.txt
start=$1
stop=$((start+1))
sed -n "/^Step $start:/,/^Step $stop:/ { /^Step $stop:/ !p }" $STEPS
)
Você está obviamente livre para nomear o que quiser; step
pareceu intuitivo para mim com base no texto do arquivo de instrução. Ajuste a variável STEPS
para ser o caminho completo para o arquivo de instruções real; Dessa forma, você não precisa se lembrar - ou digitar! - o caminho para esse arquivo na linha de comando. Eu fiz a função usar um subshell - parênteses ao redor do corpo em vez de chaves - porque eu não queria poluir o namespace do seu shell com as variáveis STEPS, start e stop. Se a criação de um subshell for mais problemática do que três novas variáveis, sinta-se à vontade para alterar o segundo conjunto de parênteses para chaves.
Eu fiz duas coisas básicas na expressão regular que don & terdon usado:
- Forçou a partida para começar no início da linha e
- exigiu que ele contivesse a palavra "Etapa" seguida pelo número, seguido por dois pontos.
Eu fiz as duas coisas porque posso imaginar o arquivo de instrução contendo potencialmente números dentro do commands to execute
e, assim, fazer com que o regex mais simples correspondesse falsamente.
Aqui está o arquivo steps.txt do "advogado do diabo" que eu estava usando:
Step 1: one
commands to execute
Step 2: two
commands to execute
commands to execute
Step 3: three
commands to execute skip to Step 7
Step 4: four
commands to execute not step 5
commands to execute
commands to execute
commands to execute
Step 5: five
commands to execute
commands to execute
commands to execute skip to Step 6:
commands to execute
Step 6: six
commands to execute
Step 7: seven
commands to execute
Step 8: eight
commands to execute
Step 9: nine
commands to execute
Step 10: ten
commands to execute
Step 11: eleven
commands to execute
Step 12: something
commands to execute
commands to execute
Step 13: something else
commands to execute
... e os resultados de um equipamento de teste (a saída de step 14
está vazia):
$ for step in $(seq 1 14); do step $step; echo; done
Step 1: one
commands to execute
Step 2: two
commands to execute
commands to execute
Step 3: three
commands to execute skip to Step 7
Step 4: four
commands to execute not step 5
commands to execute
commands to execute
commands to execute
Step 5: five
commands to execute
commands to execute
commands to execute skip to Step 6:
commands to execute
Step 6: six
commands to execute
Step 7: seven
commands to execute
Step 8: eight
commands to execute
Step 9: nine
commands to execute
Step 10: ten
commands to execute
Step 11: eleven
commands to execute
Step 12: something
commands to execute
commands to execute
Step 13: something else
commands to execute