Question

Je dois parcourir les fichiers d'un répertoire et effectuer le remplacement suivant.

Avant:

  

Bonjour $ {USER_NAME}, vous habitez à   $ {HOME_ADDRESS}. C'est maintenant $ {TIME}

Après:

  

Bonjour $ {userName}, vous habitez à   $ {homeAddress}. C'est maintenant $ {time}

Le nombre de jetons différents qui apparaissent dans $ {} est important, il n'est donc pas vraiment faisable d'exécuter:

find . -name '*' -exec sed -i 's/${USER_NAME}/${userName}/g' {} \;
find . -name '*' -exec sed -i 's/${TIME}/${time}/g' {} \;

etc.

J'espère qu'il est possible d'effectuer ce remplacement à l'aide d'une seule commande, qui ressemble à quelque chose comme:

find . -name '*' -exec sed 's/XXX/YYY/g' {} \;

Mais je ne sais pas quoi remplacer par XXX et YYY. Est-il possible de faire cela en une seule commande?

Salut, Donal

Était-ce utile?

La solution

L'indicateur -i à sed éditera un fichier sur place. Pour XXX et YYY, vous utiliseriez quelque chose comme:

sed -i 's/USER_NAME/userName/g'

et ainsi de suite.

Mise à jour: je vois que votre question portait réellement sur la modification de "USER_NAME". dans " nom d'utilisateur " automatiquement Vous pouvez essayer ce script Perl:

sub convert {
    my $r = lc 

L'indicateur -i à sed éditera un fichier sur place. Pour XXX et YYY, vous utiliseriez quelque chose comme:

sed -i 's/USER_NAME/userName/g'

et ainsi de suite.

Mise à jour: je vois que votre question portait réellement sur la modification de "USER_NAME". dans " nom d'utilisateur " automatiquement Vous pouvez essayer ce script Perl:

perl -i convert.pl inputfile.txt

Exécutez-le comme ceci:

$ cat inputfile.txt
Hello ${USER_NAME}, you live at ${HOME_ADDRESS}. It is now ${TIME}
$ perl -i convert.pl inputfile.txt
$ cat inputfile.txt
Hello ${userName}, you live at ${homeAddress}. It is now ${time}

Exemple de sortie:

<*>[0]; $r =~ s/_(.)/\U$1\E/g; return $r; } while (<>) { s/\${([A-Z_]+)}/\${@{[convert $1]}}/g; print; }

Exécutez-le comme ceci:

<*>

Exemple de sortie:

<*>

Autres conseils

Formaté pour plus de clarté:

sed -i '/^Hello/ { s/\$\{USER_NAME\}/\$\{userName\}/g 
                   s/\$\{HOME_ADDRESS\}/\$\{homeAddress\}/g 
                   s/\$\{TIME\}/\$\{time\}/g
                  }'

/ ^ Hello / identifie les lignes sur lesquelles vous souhaitez agir (précisez-le si nécessaire) et le reste substitue chaque nom de variable.

Si vous écrivez cela dans un script, envisagez d'utiliser un document HERE pour conserver le formatage et en faciliter la lecture et la mise à jour ...

La réponse ci-dessus fonctionne vraiment bien. Pour compléter, je pourrais ajouter que vous pouvez faire:

sed '/^Hello/ { s/\$\{USER_NAME\}/\$\{userName\}/g' <filename> \
   | sed 's/\$\{HOME_ADDRESS\}/\$\{homeAddress\}/g' \
   | sed 's/\$\{TIME\}/\$\{time\}/g'

Ils sont fonctionnellement identiques (sauf que le mien dépose sur stdout; vous devrez le placer quelque part (mais vous conservez l’original au cas où, comme e, vous vous trompez régulièrement sur vos expressions rationnelles). formulation juste parce que je peux commencer avec la commande one sed, puis ajouter plus avec

!! | sed 'yet-enother-regexp'

Touches fléchées? vi-mode? Qui a besoin de ça? :)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top