Substituir o caminho do arquivo correspondente pelo conteúdo do arquivo no caminho com sed

5

Eu quero escrever um script de implantação curto que insira o conteúdo de arquivos javascript no arquivo html único. Estes arquivos js estão atualmente declarados como:

  <script src="js/jquery-1.8.2.js"></script>
  <script src="js/jquery.rotate-2.2.js"></script>
  <script src="js/underscore.js"></script>
  <script src="js/backbone.js"></script>
  <script src="js/backbone.dualstorage.js"></script>
  <script src="js/favourites.js"></script>
  <script src="js/menuItem.js"></script>
  <script src="js/companies.js"></script>
  <script src="js/lectures.js"></script>
  <script src="js/banquette.js"></script>
  <script src="js/menu.js"></script>
  <script src="js/application.js"></script>
  <script src="js/main.js"></script>

Eu peguei o script sed que quase faz o que eu quero:

sed -r -e '/<script src="(.*)">/r ' -e '/<script src="(.*)">/d' index.html

O resultado da execução deste comando sed com a entrada acima é uma string vazia. Eu sou o que a parte de \ 1 está falhando. É porque as referências não funcionam fora dos comandos s?

Em exibição:

sed -r -e 's/<script src="(.*)">//'

Resultados em:

js/jquery-1.8.2.js</script>
js/jquery.rotate-2.2.js</script>
js/underscore.js</script>
And so on ...

Então, obviamente, o regexp corresponde à coisa certa.

Existe alguma maneira de depurar o que o \ 1 contém no primeiro comando para talvez ver se o caminho está incorreto?

    
por Rovanion 24.11.2012 / 17:30

2 respostas

3

Não funciona assim. Como você diz, as referências anteriores não funcionam fora dos comandos s .

Você pode fazer isso com awk ou perl com:

perl -pe 's{<script src="(.*?)">}{
  local$/;open F,"<$1";"<script>".<F>}ge'
    
por 24.11.2012 / 17:55
3

O comando e do GNU sed pode ser uma solução:

sed '
/<script src="/ {
  s/.*<script src="\([^"]\+\)">.*/cat /
  e
  }
' index.html

e executará o conteúdo do espaço padrão como o comando se sem um argumento, portanto, reescreva a linha correspondente como um comando shell como cat js/foobar.js faria o truque. A saída do comando substitui o espaço padrão.

    
por 24.11.2012 / 18:41

Tags