J'ai un code source réparti sur plusieurs fichiers.
- Il a un modèle
abcdef
que je dois remplacerpqrstuvxyz
. - Le modèle peut être
Abcdef
(Phrase Sentence), puis il doit être remplacé parPqrstuvxyz
. - Le modèle peut être
AbCdEf
(Basculer la casse), il doit alors être remplacé parPqRsTuVxYz
.
En bref, je dois faire correspondre le cas du motif source et appliquer le motif de destination approprié.
Comment puis-je y parvenir en utilisant sed
ou tout autre outil?
text-processing
sed
awk
user1263746
la source
la source
ABcDeF
?ABcDeF
->PQrStUvxyz
, alors sûrementAbCdEf
->PqRsTuvxyz
serait logiquement cohérent. Si le cas doit être copié d'une chaîne à l'autre, que doit-il se passer si la deuxième chaîne de remplacement est plus longue.Réponses:
Solution portable utilisant
sed
:C'est un peu plus facile avec GNU sed:
En utilisant
&&&
ci-dessus, nous réutilisons le modèle de casse de la chaîne pour le reste du remplacement, doncABcdef
serait changé enPQrstuVWx
etAbCdEf
versPqRsTuVwX
. Modifiez-le pour&
n'affecter que la casse des 6 premiers caractères.(notez qu'il peut ne pas faire ce que vous voulez ou peut se retrouver dans une boucle infinie si le remplacement peut être soumis à une substitution (par exemple s'il remplace
foo
pourfoo
oubcd
pourabcd
)la source
Solution portable utilisant
awk
:Exemple d'entrée:
Exemple de sortie:
Mise à jour
Comme indiqué dans les commentaires, ce qui précède ne remplacera que la première instance de
find
dans chaque ligne. Pour remplacer toutes les instances:Exemple d'entrée:
Exemple de sortie:
la source
Vous pourriez utiliser
perl
. Directement à partir de la FAQ - citantperldoc perlfaq6
:Comment puis-je remplacer la casse de manière insensible sur le LHS tout en préservant la casse sur le RHS?
Voici une belle solution Perlish de Larry Rosler. Il exploite les propriétés de xor au niveau du bit sur les chaînes ASCII.
Et ici, c'est comme un sous-programme, calqué sur ce qui précède:
Cela imprime:
Comme alternative, pour conserver la casse du mot de remplacement s'il est plus long que l'original, vous pouvez utiliser ce code, par Jeff Pinyan:
Cela change la phrase en "ceci est un cas de SUCESS."
Juste pour montrer que les programmeurs C peuvent écrire C dans n'importe quel langage de programmation, si vous préférez une solution plus semblable à C, le script suivant fait que la substitution a le même cas, lettre par lettre, que l'original. (Il se trouve également qu'il s'exécute environ 240% plus lentement que la solution Perlish.) Si la substitution a plus de caractères que la chaîne substituée, la casse du dernier caractère est utilisée pour le reste de la substitution.
la source
Si vous ajustez le remplacement à
pqrstu
, essayez ceci:Contribution:
Sortie:
Si vous souhaitez remplacer par
prstuvxyz
, peut-être ceci:Je ne trouve aucune règle à mapper
ABcDeF
->PQrStUvxyz
.la source
Quelque chose comme ça ferait ce que vous avez décrit.
la source