J'essaie de remplacer toutes les références d'un paquet nommé boots
dans un fichier de configuration.
Le format de ligne est add fast (package OR pkg) boots-(any-other-text)
, par exemple:
add fast package boots-2.3
add fast pkg boots-4.5
Je veux le remplacer par:
add fast pkg boots-5.0
J'ai essayé les commandes sed
suivantes:
sed -e 's/add fast (pkg\|package) boots-.*/add yinst pkg boots-5.0/g'
sed -e 's/add fast [pkg\|package] boots-.*/add yinst pkg boots-5.0/g'
Quelle est la bonne regex? Je pense qu'il me manque quelque chose dans la partie booléenne ou (package
ou pkg
).
sed -e 's/add fast \(pkg\|package\) boots-.*/add yinst pkg boots-5.0/g'
Vous pouvez toujours éviter le OR en le faisant deux fois
sed 's/add fast pkg boots-.*/add yinst pkg boots-5.0/g
s/add fast package boots-.*/add yinst pkg boots-5.0/g'
Utilisez le mode regex étendu et n’échappez pas au |
.
sed -E -e 's/add fast (pkg|package) boots-.*/add yinst pkg boots-5.0/g'
Vous mélangez BRE et ERE échappent à la fois à ()
et |
ou à aucun.
sed utilise par défaut des expressions régulières, ce qui permet d’utiliser des expressions régulières étendues dépend de la mise en œuvre, par exemple. avec BSD sed, vous utilisez le commutateur -E
, GNU sed le décrit comme -r
, mais -E
fonctionne également.
GNU (Linux):
1) Faire les chaînes aléatoires suivantes
cidr="192.168.1.12"
cidr="192.168.1.12/32"
cidr="192.168.1.12,8.8.8.8"
à blanc
2) sed avec -r pour utiliser les opérateurs logiques dans GNU comme @Thor mentionné, et -i pour éditer à la volée un fichier sur la correspondance trouvée
$ echo '<user id="1000" cidr="192.168.1.12">' > /tmp/1000.xml
$ sed -r -i \
s/'cidr="192.168.1.12\/32"|cidr="192.168.1.12"|192.168.1.12,'/''/ /tmp/1000.xml
-r = GNU sed
-i = search / match/ edit the changes to the file on the fly