Acho que seria um erro chamar muitos sed
s, onde apenas um fará. A alegação de sed
para a fama é sua capacidade de fazer o loop de forma eficiente na entrada e modificá-la em uma saída diferente, mas também pode lidar com saídas múltiplas com muita facilidade. Aqui, por exemplo, é uma re-escrita POSIX portátil (e muito mais eficiente) do seu for
loop:
echo "Solve[x^2+5^a==$((a=0)),x]>>a.out" >/tmp/i.m ###create file + init $a
until [ "$((a+=1))" -gt 10 ] ###iterate + test
do printf "h;s/a/$a/gpw /tmp/$a.m\ng;" ###push new sed command
done| sed -nf - /tmp/i.m ###read + apply commands
head /tmp/[0-9].m /tmp/10.m ###print results
sed
pode ler seu script de stdin e aplicá-lo a um arquivo nomeado - que é o que a instrução sed -nf - /tmp/i.m
faz. Ele também pode, simultaneamente, p
rint sua saída para stdout e w
rite sua saída para um ou mais arquivos nomeados. À medida que o loop de shell funciona, ele imprime linhas em sed
, que, quando concluídas, equivalem a:
h;s/a/1/gpw /tmp/1.m
g;h;s/a/2/gpw /tmp/2.m
g;h;s/a/3/gpw /tmp/3.m
g;h;s/a/4/gpw /tmp/4.m
g;h;s/a/5/gpw /tmp/5.m
g;h;s/a/6/gpw /tmp/6.m
g;h;s/a/7/gpw /tmp/7.m
g;h;s/a/8/gpw /tmp/8.m
g;h;s/a/9/gpw /tmp/9.m
g;h;s/a/10/gpw /tmp/10.m
g
Que informa sed
para ...
- Sobrescreve seu buffer
h
old com uma cópia de seu buffer de edição.
-
g
lobally s///
ubstitua todas as ocorrências da letra a
em seu buffer de edição com qualquer valor atual da variável $a
.
- Ao mesmo tempo, os dois
p
rinting os resultados dessa s///
ubstitution para stdout e w
os resultados para o arquivo chamado /tmp/$a.m
, em que $a
é iterável.
- E durar para
g
et o buffer de retenção sobrescrevendo o buffer de edição.
sed
aplicará essa sequência para cada linha em seu arquivo de entrada nomeado. Quando for chamado pela primeira vez, truncará cada um de seus arquivos com nome w
rite, mas depois anexará cada ação w
rite a cada arquivo de saída em seqüência. Como tenho apenas uma linha em i.m
, porém, sed
imprime:
Solve[x^2+5^1==0,x]>>1.out
Solve[x^2+5^2==0,x]>>2.out
Solve[x^2+5^3==0,x]>>3.out
Solve[x^2+5^4==0,x]>>4.out
Solve[x^2+5^5==0,x]>>5.out
Solve[x^2+5^6==0,x]>>6.out
Solve[x^2+5^7==0,x]>>7.out
Solve[x^2+5^8==0,x]>>8.out
Solve[x^2+5^9==0,x]>>9.out
Solve[x^2+5^10==0,x]>>10.out
E head
, lendo cada um dos dez arquivos recém-criados em /tmp
, imprime:
==> /tmp/1.m <==
Solve[x^2+5^1==0,x]>>1.out
==> /tmp/2.m <==
Solve[x^2+5^2==0,x]>>2.out
==> /tmp/3.m <==
Solve[x^2+5^3==0,x]>>3.out
==> /tmp/4.m <==
Solve[x^2+5^4==0,x]>>4.out
==> /tmp/5.m <==
Solve[x^2+5^5==0,x]>>5.out
==> /tmp/6.m <==
Solve[x^2+5^6==0,x]>>6.out
==> /tmp/7.m <==
Solve[x^2+5^7==0,x]>>7.out
==> /tmp/8.m <==
Solve[x^2+5^8==0,x]>>8.out
==> /tmp/9.m <==
Solve[x^2+5^9==0,x]>>9.out
==> /tmp/10.m <==
Solve[x^2+5^10==0,x]>>10.out