2017-10-04 2 views
-1

J'obtiens actuellement une erreur sed sur plusieurs caractèressed -e indéterminés la commande `s

sed: -e expression #1, char 37: unterminated `s' command 

mon entrée sed ressemble à ceci

s/EMAIL/[email protected]/;s/FULLNAME/Pop Corn/;s/TITLE/Col./;s/NAME/Corn/;s/AMOUNT/200/ 
s/EMAIL/[email protected]/;s/FULLNAME/Penny Loafer/;s/TITLE/Miss/;s/NAME/Loafer/;s/AMOUNT/300/ 
s/EMAIL/[email protected]/;s/FULLNAME/Melba Toast/;s/TITLE/Ms./;s/NAME/Toast/;s/AMOUNT/250/ 
s/EMAIL/[email protected]/;s/FULLNAME/Bob L Head/;s/TITLE/Mr./;s/NAME/Head/;s/AMOUNT/990/ 

où chaque ligne lue à partir de ce fichier est une commande distincte sed.

template="template.txt" 
details="p4Customer.txt" 
count=1 
filename="customer${count}.txt" 

gawk -f g1.awk $details | while read detail; #outputs the file above and pipes into while loop 
    do 
     sed -E $detail $template > "$directory/$filename"; 
     count=$(($count+1)) 
    done; 

Je me suis assuré que je les 3 / et ;. Je n'arrive pas à comprendre ce qui ne va pas, peut-être que je l'ai regardé trop longtemps.

+0

'char 37' est un indice probable. Il suffit de compter les caractères à l'avant de votre chaîne et d'examiner de près ce modèle 's/str/rep /'. Bonne chance. – shellter

+0

@shellter ok donc l'espace est ce qui cause l'erreur si je me trompe? Est-ce que '' \ "\" 'serait la bonne syntaxe? –

+0

Quel est le motif 's/str/rep /' qui contient le char 37ths? Sortir un moment. Je mettrais chaque 's/str/rep /' sur une ligne séparée, quelque chose pourrait apparaître sur vous. Avez-vous écrit ce fichier sur Windows et le déplacer vers LInux? Si c'est le cas, le 'dos2unix myFixer.sed' peut résoudre le problème. Bonne chance. – shellter

Répondre

3

Vous n'avez pas cité deux fois vos références de variable. Sans les guillemets autour d'eux, le shell va diviser la valeur de la variable en "mots" (et ensuite essayer d'étendre les caractères génériques de fichier qu'il trouve dans l'un des mots). Puisque vos commandes sed contiennent des espaces, elles seront divisées en plusieurs mots, ce qui complètera complètement le sed. Plus précisément, avec detail défini sur "s/EMAIL/[email protected]/; s/FULLNAME/Pop Corn /; s/TITRE/Col./; s/NOM/Maïs /;/AMOUNT/200/"la commande sed -E $detail $template équivaut à:

sed -E 's/EMAIL/[email protected]/;s/FULLNAME/Pop' 'Corn/;s/TITLE/Col./;s/NAME/Corn/;s/AMOUNT/200/' template.txt 

Ainsi sed tente d'exécuter s/EMAIL/[email protected]/;s/FULLNAME/Pop sur les fichiers nommés" maïs /; s/TITLE/Col ./; s/NOM/maïs /; s/MONTANT/200/"et" template.txt ".

Solution: guillemet les variables:

sed -E "$detail" "$template" > "$directory/$filename" 

BTW, vous pouvez aussi ne pas besoin de la ; à la fin de la ligne. Aussi, je recommande shellcheck.net pour repérer les problèmes de base comme celui-ci.

Il existe également un problème de logique dans le script. Vous incrémentez count chaque fois par le biais de la boucle, mais ne mettez pas à jour filename. Ainsi, il sortira à "customer1.txt" à chaque fois à travers la boucle. Vous devez mettre à jour filename à chaque fois, ou simplement inclure le modèle (y compris $count) dans la redirection.