0
votes

gnu fait symbole de hasch au milieu de la chaîne

J'essaie d'imprimer la version de fichier perforce du fichier de fabrication lorsqu'il est exécuté. J'utilise la balise $ $ €, qui se développe à $ ID: //repository/path/check.make#6 $ ou similaire et je veux imprimer // référentiel / chemin / chèque.make # 6 dans un fichier (en utilisant actuellement ECHO). Je ne peux pas comprendre comment faire pour prendre le # dans le cadre de la chaîne et non le début d'un commentaire. J'ai essayé: xxx

et d'autres variations mais je continue à obtenir: xxx


14 commentaires

Je veux juste imprimer la variable avec '#' au milieu de cela. Ma stratégie actuelle était d'essayer de remplacer «#» avec '\ #'.


Vous avez une variable contenant une chaîne contenant un # et vous souhaitez imprimer cette chaîne, est-ce correct?


Oui, j'utilise $ id $ dans mon fichier perforce qui se développe à quelque chose comme "$ Id: //repository/path/check.make#6 $". Je veux imprimer "//Repository/path/check.make#6" à partir de celui-ci, alors j'ai besoin que le # soit vu comme un caractère de chaîne et non le début d'un commentaire.


Oui, je ne peux pas avoir un numéro littéral non évalué dans le maquillage et ne pas avoir interprété comme un commentaire. Donc, ce que j'ai est une chaîne qui contient un # non évalué, et mes efforts pour utiliser la SEL pour ajouter dans le caractère d'échappement ont été infructueuses jusqu'à présent.


Je pense que cela nécessite un peu plus d'arrière-plan. Lorsque je soumettez une modification du fichier dans Perforce, le numéro de version change, donc au lieu d'être //repository/path/check.make#6 La nouvelle version serait //Repository/path/peck.make#7. Perforce vous permet de faire référence à cette information dans le script en ajoutant $ ID $ au code, qui est étendue à "$ ID: //repository/path/peck.make#6 $" ou "$ id: // référentiel / chemin /check.make#7 $ ". Ce qui donne à votre script la possibilité d'enregistrer quelle version d'elle-même est exécutée. Je veux imprimer cette chaîne, mais elle contient un # donc je ne peux pas sauf si je ne peux pas échapper.


Pouvez-vous me dire pourquoi vous avez préféré la réponse de Tripleee sur le mien?


Je mets $ ID $ dans mon code et l'outil CM étend à quelque chose comme "$ ID: //Repository/path/check.make#6 $". J'ai donc cette chaîne dans mon code, mais je ne l'ai pas placé là-bas, obtenez-la d'un argument ou de contrôler sa valeur. De cette chaîne, j'ai besoin d'extraire le champ du milieu et d'écrire dans un fichier. Pour ce faire, je dois échapper au symbole "#". Même si ce n'est pas une solution idéale, je peux faire l'extraction et ajouter le caractère d'échappement avec SED, je ne pouvais pas comprendre de façon (d'où la question) d'ajouter le caractère d'échappement avant le caractère # avec des commandes de fabrication.


Oui, je vous ai bien compris alors. Ma solution fait exactement ce que vous voulez sans recourir à un deuxième outil sur la coquille. Pour obtenir la chaîne moyenne, faites un $ (mot 2, $ (valeur perforce_id))


Quand je fais $ (mot 2, $ (valeur perforce_id)) je reçois le message "*** Séparateur manquant. Arrêtez-vous." Parce qu'il interprète le numéro au milieu de la chaîne comme début d'un commentaire et qu'il ignore donc les parens rapprochés car ils font partie du commentaire, au moins c'est mon interprétation de la raison pour laquelle je reçois ce message d'erreur. Peut-être que je manque quelque chose de votre explication parce que je ne semble pas être capable de faire fonctionner cela si je n'échappe pas à ce personnage.


Non, désolé, alors vous faites quelque chose de mal. Quand un # est à l'intérieur d'une variable, il ne s'agit que d'un caractère normal qui est non interprété . Seulement quand il entrave dans un contexte où l'analyseur de fabrication l'interpréte à nouveau, il sera considéré comme un commentaire début, .e.g. Dans un EVAL appel.


Peut-être que c'est parce que nous avons une version plus ancienne (3.8) de faire sur le système? Autre que cela, je ne sais pas exactement ce que je ferais mal que je copié votre code directement et que j'ai reçu ce message d'erreur,


Ok, '3.80' est vraiment vieux - 18 ans! Quel système est-ce que cela vous oblige à utiliser un tel outil obsolète?


Je ne pouvais même pas avoir ma main sur une version exécutée 3.80. En 3.81 Toutefois, la méthode fonctionne comme prévu. 3.80 Semble avoir des bugs dans la méthode eval - une mise à jour de 3.81 est fortement recommandable.


Pouvez-vous accepter ou supprimer la question? Ou au moins d'une explication - comme il se trouve, ma solution est correcte et de loin la plus simple économie pour le bogue en 3.80.


3 Réponses :


0
votes

Cela aiderait si vous avez fourni un exemple complet de ce que vous voulez. Je ne comprends pas vraiment pourquoi vous essayez de STI un hachage avec un hachage de barreaux Si vous nous montrez un exemple complet, y compris la manière dont vous obtenez la chaîne et aussi ce que vous voulez faire avec la variable ar1 , nous pourrions réellement vous donner des conseils.

Mais, le moyen d'utiliser des hachages En GNU, il est de les mettre dans une variable: xxx

c'est tout ce que je peux dire sans plus d'informations.

ETA

Oui, je suis très familier avec l'expansion des mots clés ... Il est originaire de SCCS / RCS de retour dans la journée :).

Je vois, vous voulez dire que vous voulez mettre Le $ ID $ dans votre maquillage , alors lorsque votre maquillage est vérifié, la valeur sera remplacée. Ce n'était pas clair pour moi.

Je suis désolé de dire que ce que vous voulez faire est proche de l'impossible. Le problème est que vous ne pouvez pas échapper à la valeur dans le maquillage parce que vous n'écrivez pas la valeur dans le makefile, perforce est. Et perforce ne l'évitent pas.

Vous n'avez que deux options que je peux voir:

Premièrement, n'essayez pas de mettre cela dans une variable de fabrication. Il y a plusieurs façons de le faire, en fonction de ce que vous voulez vraiment. Une solution consiste à créer un fichier d'en-tête contenant const char * foo = "$ id $"; et que cela soit remplacé. Si vous voulez vraiment que l'ID du maquillage, mais que vous n'en avez pas besoin que dans une certaine recette, vous pouvez la mettre directement dans cette recette: xxx

(je ne suis pas réellement Assurez-vous que le truc € / code> fonctionnera ici, cela dépend de la manière dont Perforce remplace les choses ... Si ce n'est pas vous pouvez utiliser echo '$ id $ x' vous " ll perdez les signes du dollar mais gardez le reste).

La seule autre option consiste à mettre à niveau votre version de GNU faire au plus récent (4.3). Dans cette version, une manipulation cassée de caractères de hachage dans la fonction $ (shell ...) a été corrigée, ce qui signifie que vous pouvez utiliser: xxx p > et cela fonctionnera (mêmes mises en garde et solutions, pour $$ ici comme ci-dessus).


2 commentaires

Perforce a une fonctionnalité (marquage RCS) où vous mettez des mots-clés dans votre code et il les étend, donc si je mets $ ID $ dans mon fichier et soumettez-le, le fichier contiendra "$ ID: //repository/check.make#6 $ "au lieu de $ id $. Je veux définir un Var à $ ID $ (qui va se développer //repority/check.make#6) et imprimer la version de fichier exécutée lorsque le code s'exécute. Lorsque je vais imprimer la version (//Repority/check.make#6), il chute le n ° 6 à cause du caractère de commentaire. Échapper le # fonctionnerait, mais je ne peux pas comprendre la syntaxe pour changer "//repository/check.make#6" à "//Repository/check.make /#6".


Est-ce que le littéral # dans Multi-Line définit (voir ma solution) un bug ou une fonctionnalité? Ça va partir un jour?



0
votes

Vous ne pouvez pas avoir un littéral non évalué # code> dans un faire une affectation code> et ne pas être interprété comme un caractère de commentaire. Mais en tant que pirate de hack, vous pouvez avoir l'extrait de coquille de ce jeton de l'actuel Makefile code>.

# $Id: //repository/path/check.make#6 $
str1 := $(shell sed '/[$$]Id[$$:]/!d;s/^\# [$$]Id: \(.*\) [$$].*/\1/' Makefile)


5 commentaires

Notez que la manipulation de # dans GNU marque a été ajustée (fixe) dans GNU FAIT 4.3 afin que vous n'ayez plus besoin de barres anti-backs. Pour la portabilité, il est préférable de déclarer une variable comme dans mon exemple ci-dessus: hash = \ # puis utilisez-le dans votre fonction coquille .


STR1 = $ (shell sed -n '/[$$]id:/s/.* (\ / \ /.*) \ # ([0-9] *). * / \ 1 \\\ # \ 2 / GP '$ (FIRMWWORD $ (MAKEFILE_LIST)) était ce que j'ai fini par (excuser mes mauvaises compétences de formatage)


Vous pouvez utiliser un autre séparateur 'SS% REGEX%% de% P »de sorte que vous n'ayez pas à échapper aux barres obliques littérales. Je ne vois pas pourquoi vous auriez besoin d'un drapeau g ; Sûrement, vous n'avez pas plus d'un de ces identifiants sur la même ligne?


Si cela vous a aidé, veuillez envisager de pervers et / ou de l'accepter. Si vous voulez, vous pouvez également poster une réponse à votre propre et accepter cela. L'acceptation marque le problème tel que résolu et récompense le répondeur de quelques points de réputation. Voir aussi aide.


" Vous ne pouvez pas avoir une liste littérale non évaluée " bien, dans la multi-ligne définie, vous pouvez :)



1
votes

Peut-être que je ne vous ai peut-être pas été correctement, mais les œuvres suivantes pour un acteur extérieur remplaçant $ ID $ sans s'échapper: xxx

comme test, je suis simplement Mettre dans la substitution de texte de perforce moi-même: xxx

sortie: xxx


0 commentaires