11
votes

Erreur SED - Modèle de substitution interminé

Je suis dans le répertoire avec des fichiers composés de nombreuses lignes de lignes telles que ceci: xxx

, puis une ligne qui se termine: xxx

J'essaie d'éliminer :( float) à partir de chaque fichier (mais laissez le numéro) et supprimez également la ligne de nettoyage.

Je peux obtenir: xxx

fonctionner, mais cela crée des fichiers qui conservent les anciens fichiers. Suppression du drapeau -E se traduit par une erreur de modèle de substitution non définie.

même affaire avec: xxx

pensées?

sed

4 commentaires

Qu'est-ce que "crée des fichiers qui conservent les anciens fichiers" signifie?


Si j'ai un fichier appelé ABC. Il supprime les lignes du fichier ABC, mais crée un fichier appelé Abce.


Le g n'est pas nécessaire si le motif n'apparaît qu'une fois par ligne.


Je sais que je suis en retard, mais sed -ie 'S /: (float) // g' * et sed -ie 's / [mandrin]: nettoyage ... / / g '* ne fera probablement pas ce que vous attendez; Le () autour de (flotteur) , le [] autour [float] et le . .. dans nettoyage ... sont tous des modèles spéciaux. Avec sed -ie 'S /: (float) // g' * , il correspondrait probablement : float aussi. Et avec sed -ie 's / [mandrin]: nettoyage ... // g' * , il ne correspondrait pas [mandrin]: nettoyage ... Mais correspondrait au K: Nettoyage UP123 .


6 Réponses :


1
votes
sed -i -e 's/ :(float)//g' *

0 commentaires

14
votes
sed  -i  ''  -e  's/:(float)//'  -e  '/^.chuck/d'  *
This way you are telling sed not to save a copy (null length backup extention to -i) and separately specifying the sed commands. 

1 commentaires

Pour que les gens obtiennent la "chaîne de source de transformation non déterminée", ceci est efficacement la réponse. Sur certaines versions de SED (notamment la version BSD, incluse avec MacOS), vous devez inclure explicitement la chaîne vide '' '' '' '' après le -i lorsque vous ne voulez pas que SED Pour faire une sauvegarde, sur d'autres plates-formes, vous pouvez laisser cela. Les messages d'erreur que les sorties SED lorsqu'elles sont nécessaires et que vous ne le laissez pas dehors, sont malheureusement plutôt cryptiques.



3
votes
sed -ie -e expression [files...]

0 commentaires

3
votes

Vos numéros sont séparés avec (float) par le caractère : . Par conséquent, vous pouvez utiliser AWK / CUT pour obtenir vos numéros. Sa plus simple qu'une regex xxx


0 commentaires

1
votes

Vérifiez si vous avez des noms de fichiers impairs dans le répertoire.

Voici un moyen de dupliquer votre erreur: P>

$ rm "-e s:x:"
rm: invalid option -- 'e'
$ rm -- "-e s:x:"


0 commentaires

2
votes

solution:

SED -I '' 'S /: (flotteur) // g' *

SED -Je '' 'S / [Chuck]: nettoyage ... // g' *

Explication:

Je peux obtenir: xxx

fonctionner, mais cela crée des fichiers qui conservent les anciens fichiers.

C'est parce que sed 's i est censé fonctionner de cette façon

-I extension

Modifier les fichiers en place, enregistrer des sauvegardes avec l'extension spécifiée . Si une extension de longueur zéro est donnée, aucune sauvegarde ne sera enregistrée.

Dans ce cas E est en cours d'interprétation de Extension que vous souhaitez enregistrer vos sauvegardes avec. Donc, tous vos fichiers d'origine seront sauvegardés avec un E annexci à leurs noms.

Pour fournir une extension de longueur zéro, vous devez utiliser -i '' .

note : Contrairement à -i - -I '' 'T Travailler. Vous devez avoir un caractère espace entre -i et '' afin de fonctionner.


La suppression du drapeau -E donne une erreur de modèle de substitution interminée.

Lorsque vous supprimez le E immédiatement après -i ,

SED -I 'S /: (flotteur) // g' *

S /: (flotteur) // g sera maintenant interprété comme l'argument extension à i drapeau. Et le premier fichier de la liste des fichiers produits par shell expansion de * est interprété comme une fonction SED (plus probablement S / Expression régulière / Remplacement / Drapeaux < / Code> Fonction) Vous pouvez vérifier cela en cochant la sortie de

SEDFN = $ (ECHO * | CUT -D '' -F1); [[$ {SEDFN: 0: 1} == "s"]]; echo $?

Si la sortie de la chaîne de commandes ci-dessus est 0 , notre hypothèse est validée.

aussi dans ce cas, Si d'une manière ou d'une autre, le premier nom de fichier qualifie comme une fonction de remplacement S / S / SED valide SED, les autres noms de fichiers seront interprétés comme des fichiers réguliers de SED pour fonctionner.


0 commentaires