Inserindo os resultados de um loop for em um arquivo html - BASH

0

Eu tenho um script que pega os resultados de um comando e os coloca em um código html.

Aqui está o que eu tenho até agora ...

#!/bin/bash

list_dir='ls -t downloads/'

for i in $list_dir
do
#----  
#       echo "<a href=\"downloads/$i\">$i</a>"
#----attempt 1   
#    
  ' sed -n 'H;${x;s/placeholder .*\n/<a href="downloads/$i">$i</a>\
                       &/;p;}' index.html'
done

Estou tentando obter os resultados do loop for para substituir o conteúdo do arquivo html onde ele diz "placeholder" (prefiro que apenas insira o conteúdo abaixo de um certo ponto sem ter os espaços reservados). Eu não estou muito certo sobre como fazer isso.

    
por tyler 27.05.2013 / 07:01

3 respostas

1

As substituições de parâmetro podem ser usadas para substituir texto sem problemas de escape:

output=$(ls -t downloads | while IFS= read -r f; do
    echo "<a href=\"downloads/$f\">$f</a>"
done)

html=$(<index.html)
html=${html/placeholder/$output}
echo "$html" > output.html

Você também pode usar awk -v para passar o texto de substituição como uma variável:

awk -v v="$output" '{sub("placeholder",v);print}' index.html > output.html

Ou use o Ruby para substituir um padrão de várias linhas sem exigir um marcador:

echo "$output" | ruby -i -e 'print gets(nil).sub(/<a .*<\/a>\n/m, STDIN.read)' index.html
    
por 27.05.2013 / 10:33
0

Se você quiser apenas substituir todo o conteúdo do arquivo, em vez de inserir de alguma forma sua saída no meio, sua tentativa nº 1 poderá estar mais próxima do que você deseja do que uma abordagem baseada em sed , se você redirecionar a saída do loop inteiro:

#!/bin/bash

list_dir='ls -t downloads/'

for i in $list_dir
do
    echo "<a href=\"downloads/$i\">$i</a>"
done > index.html
    
por 27.05.2013 / 07:13
0

Existem vários problemas com a sua linha sed , por ex. com a variável $i em aspas simples nunca sendo expandida.

Tendo em conta o seguinte index.html:

<html>
<body>
<!-- placeholder -->
</body>
</html>

tente usar arquivos intermediários para o sed in / output:

#!/bin/bash

list_dir='ls -t downloads/'

cp index.html out.html

for i in $list_dir
do
   sed "s/<!-- placeholder -->/<a href='downloads\/$i'>$i<\/a>\n<!-- placeholde
r -->/" out.html > tmp.html
   mv tmp.html out.html
done
cat out.html

É claro que você terá problemas quando houver nomes de arquivos com espaços, mas isso é outro problema.

    
por 27.05.2013 / 07:27

Tags