web-dev-qa-db-fra.com

Booléen OR dans sed regex

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).

16
Adam Matan
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'
21
bobbogo

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'
16
Spencer Rathbun

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.

7
Thor

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
0
YumYumYum