2017-07-17 1 views
0

Je dois valider l'ID avec motif (Abbbbb-yyy)Comment Valider Id est correcte avant de créer le fichier à l'aide makefile

Exemple:

ID := A12345-789 B98765-123 C58730-417 
VARIANT := test1 test2 test3 

Construire et post-traitement génère des fichiers dépend sur VARIANTES :

`sw_main_test1.hex ,sw_main_test1.hex and sw_main_test1.hex ` 

.PHONY : SW_TEST 
SW_TEST : 
    if <ID is correct> 
    cp sw_main_test1.hex --> A12345-789.hex 
    cp sw_main_test2.hex --> B98765-123.hex 
    cp sw_main_test3.hex --> C58730-417.hex 

Je suis face à problème dans la validation de l'ID avec motif

`Abbbbb-yyy.txt` 

Où: A=[A-Z]; b=[0-9]; y=[0-9]

S'il vous plaît laissez-moi savoir comment vérifier ID est correcte en utilisant des expressions régulières à l'intérieur du Makefile en utilisant un outil ou utilitaire

+0

Comment on faire, dépend quelques autres facteurs. Les fichiers sont-ils eux-mêmes ciblés, ou sont-ils simplement générés, alors qu'une cible différente est construite en tant que sous-produit? Si les fichiers sont eux-mêmes des cibles, je suppose que votre makefile est lui-même généré, comment faites-vous cela? Veuillez lire [mcve] (https://stackoverflow.com/help/mcve). – Krom

+0

Je recommande de déléguer le test de nom à un script. Quels langages de script êtes-vous à l'aise avec? – Beta

+0

@Beta: Je suis à l'aise avec python – Vicky

Répondre

0

Dans ce script, je suppose, vous obtenez votre carte d'identité d'un fichier (Je l'ai appelé ici someidcontent.txt). Ensuite, vous pouvez écrire un script comme celui-ci (en supposant que vous travaillez uniquement sur Linux).

getID = $(shell cat someidcontent.txt) 

all: 
    if [ "$(getID)" == "1234567890" ]; then \ 
     cp -v output.txt ./delivery/$(getID).txt; \ 
    fi 

.PHONY: all 

Modifier

je fait une erreur dans mon script précédent. Je n'ai pas vérifié, si l'identifiant est correct. Maintenant, mon nouveau script fait ceci: je lis dans un fichier l'identifiant et je vérifie s'il est correct. Si l'ID est correct, alors un fichier sera copié dans le répertoire cible avec le numéro d'identification.

# get ID from a file 
getID := $(shell cat someidcontent.txt) 
# need a hack for successful checking 
idToCheck := $(getID) 

# check procedure 
checkID := $(shell echo $(idToCheck) | grep "[A-Z][0-9][0-9][0-9][0-9]-[0-9][0-9][0-9]$$") 

all: 
ifeq "$(checkID)" "$(idToCheck)" 
    echo found 
    cp -v output.txt ./delivery/$(idToCheck).txt; 
endif 

.PHONY: all 

Edit 2

Ok, cela était un peu difficile, mais je l'ai résolu en quelque sorte. Peut-être y a-t-il aussi d'autres moyens de résoudre cela mieux. Dans ma solution, je suppose que le fichier avec les ID et les noms de fichiers sources ressembler à ceci (en d'autres termes, c'est le contenu de mon someidcontent.txt):

A2345-678:output1.txt 
B3456-123:output.txt 
C0987-987:thirdfile.txt 

Et voici mon makefile avec des commentaires pour des explications supplémentaires. Je l'espère, ils sont suffisants

# retrieve id and filename data from other file 
listContent := $(shell cat someidcontent.txt) 

# extract only IDs from other files 
checkIDs = $(shell echo $(listContent) | grep -o "[A-Z][0-9][0-9][0-9][0-9]-[0-9][0-9][0-9]") 

all: 
# iterate only over IDs 
# first, give me the ID 
# second retrieve the filename part for successful copy procedure 
# and copy the file to the target dir with ID as filename 
    @$(foreach x,$(checkIDs), \ 
     echo $(x); \ 
     cp -v $(shell echo $(listContent) | grep -o "$(x):[A-Z0-9a-z\.]*" | sed "s/[-A-Z0-9]*://g") ./delivery/$(x).t$ 
    ) 

.PHONY: all 
+0

Kristain votre réponse est bonne mais la Cela fonctionnera si nous avons un seul ID et un seul fichier de sortie si nous avons la liste des IDS et la liste des fichiers de sortie il va échouer – Vicky

+0

@Vicky: Y at-il un moyen de déterminer quel fichier de sortie appartient à quel ID? – kristian

+0

@kristain son premier élément de liste d'ID de séquence correspond au premier élément de liste VARIANT – Vicky

0

Vous pouvez vérifier les modèles de chaîne simple tout à fait correct (ne veut pas dire « bien ») à partir de la marque:

[A-F] := A B C D E F# 
[a-f] := a b c d e f# 
[A-Z] := $([A-F]) G H I J K L M N O P Q R S T U V W X Y Z# 
[a-z] := $([a-f]) g h i j k l m n o p q r s t u v w x y z# 
[0-9] := 0 1 2 3 4 5 6 7 8 9# 

###################################################################### 
##### $(call explode,_stringlist_,_string_) 
## Insert a blank after every occurrence of the strings from _stringlist_ in _string_. 
## This function serves mainly to convert a string into a list. 
## Example: `$(call explode,0 1 2 3 4 5 6 7 8 9,0xl337c0de)` --> `0 xl3 3 7 c0 de` 
explode = $(if $1,$(subst $(firstword $1),$(firstword $1) ,$(call explode,$(wordlist 2,255,$1),$2)),$2) 


ID := A12345-789 B98765-123 C58730-417 123456+328 

############################################################ 
# $(call check-id,_id-string_) 
# Return 'malformed' or the given id 
check-id = $(if $(call check-id-1,$(call explode,- $([A-Z]) $([0-9]),$1)),malformed,$1) 
check-id-1 = $(strip $(filter-out $([A-Z]),$(wordlist 1,1,$1)) $(filter-out $([0-9]),$(wordlist 2,6,$1)) $(filter-out -,$(word 7,$1)) $(filter-out $([0-9]),$(wordlist 8,10,$1))) 

$(info $(foreach w,$(ID),$(call check-id,$(w))))