2017-10-01 5 views
0

Les œuvres sed suivantes parfaitement dans basho:tuyau dans le Makefile

pkexec /opt/texbin/tlmgr install $(cat source/*.md | sed -n 's~^[^%]*\\usepackage[^{]*{\([^}]*\)}.*$~\1~p' | paste -sd ' ' -) 

Cependant, lorsque je l'ajoute à une cible de marque:

$(shell pkexec /opt/texbin/tlmgr install $(cat source/*.md | sed -n 's~^[^%]*\\usepackage[^{]*{\([^}]*\)}.*$~\1~p' | paste -sd ' ' -)) 

je reçois l'erreur:

/bin/sh: 1: Syntax error: Unterminated quoted string 
  • Quelle est la bonne façon d'utiliser sed dans un Makefile?

Répondre

1

Je pense que l'erreur est en fait un effet secondaire de la façon dont make étend $ les références de variable et les appels de fonction. Il y a deux problèmes avec votre exemple:

  • Vous écrivez $(cat …), mais faites va étendre ce (à rien), semblable à la façon dont il se développe ($shell …). Vous devez écrire $$(cat …), de sorte que le signe dollar soit transmis à la coque.
  • Le ) dans l'expression régulière est traité comme un terminateur pour l'appel de fonction make (cat tel qu'il est écrit, mais il peut être shell).

Pour fixer la deuxième question, mettre l'expression régulière dans une variable de marque, doublant la $:

regexp = s~^[^%]*\\usepackage[^{]*{\([^}]*\)}.*$$~\1~p 

font référence à partir de la commande sed:

$(shell pkexec /opt/texbin/tlmgr install $$(cat source/*.md | sed -n '$(regexp)' | paste -sd ' ' -)) 

Maintenant, le ) est caché à l'analyseur d'appel de fonction make et ne le confond plus. Le '…' est toujours nécessaire pour empêcher l'expansion du shell de l'expression régulière.