J'utilise sed pour trouver et remplacer des modèles dans les fichiers SAS que j'ai plutôt que de les modifier individuellement. Le problème est que j'essaie de remplacer les variables de macro et que lorsque j'utilise l'esperluette, il ne fonctionne pas correctement.
Here's my code:
sed -ie 's/user=&uid./user=&sysuserid./g' *_table_*.sas
chaque fois que j'exécute cette commande, elle semble s'ajouter et faire toutes sortes de choses géniales avec le texte original.
Question: Comment remplacer du texte contenant des esperluettes par la commande sed?
&
est un caractère spécial, il doit donc être échappé lorsqu'il est utilisé dans le RHS - dans votre cas, vous devez exécuter's/user=&uid./user=\&sysuserid./g'
bien que je soupçonne que vous devez également échapper le point dans le LHS pour correspondre à un point littéral afin que vous en ayez réellement besoin's/user=&uid\./user=\&sysuserid./g'
Réponses:
&
est spécial dans le texte de remplacement: cela signifie « toute la partie de l'entrée qui a été compensée par le modèle », donc ce que vous faites ici remplaceuser=&uidX
avecuser=user=&uidXsysuserid.
. Pour insérer une esperluette réelle dans le texte de remplacement, utilisez\&
.Une autre chose qui semble erronée est que
.
dans le modèle de recherche représente n'importe quel caractère (sauf une nouvelle ligne), mais.
à la fin du texte de remplacement est un point littéral. Si vous souhaitez remplacer uniquement la chaîne littéraleuser=&uid.
, protégez le.
avec une barre oblique inverse.Si vous souhaitez remplacer un caractère et le conserver dans le résultat, placez le caractère dans un groupe et utilisez-le
\1
dans le remplacement pour faire référence à ce groupe.En fait, compte tenu de la répétition entre le texte original et le remplacement, vous devez quand même utiliser des groupes:
c'est-à-dire «remplacer
u
parsysuser
entreuser=&
etid.
».la source
\(user=&\)
est un modèle qui corresponduser&
et stocke la chaîne de correspondance en tant que groupe (groupe numéro 1 car c'est le premier groupe du modèle). Ensuite, dans le remplacement\1
est remplacé par la chaîne stockée pour le groupe numéro 1.=
dans les expressions régulières et dans le texte de remplacement est synonyme de lui-même, doncuser=&
correspond uniquementuser=&
, etuser=&
dans le texte de remplacement, il estuser=
suivi de la partie de la ligne correspondant à l' expression régulière .=
personnage n'a pas de signification particulière.user=&
dans le texte de remplacement produituser=
suivi du texte original correspondant.user=\&
dans le texte de remplacement produituser=&