2009-11-24 7 views
2

Je souhaite utiliser le motif de recherche dans la partie de sortie d'une commande sed. Par exemple, étant donné la commande sed suivante:sed: utilisation du motif de recherche dans la sortie

sed '/HOSTNAME=/cHOSTNAME=fred' /etc/sysconfig/network 

Je voudrais remplacer la deuxième instance de « hostname = » avec une séquence d'échappement qui fait référence au terme de recherche. Quelque chose comme ceci:

# this doesn't actually work 
sed '/HOSTNAME=/c\?=fred' /etc/sysconfig/network 

Est-ce que anywone savoir s'il y a une façon de le faire ou dois-je répéter le terme de recherche dans la réponse.

Je sais que je peux faire quelque chose comme ceci:

sed 's/\(HOSTNAME=\)/\1fred/' /etc/sysconfig/network 

Mais ceci est subtilement différent de ce que je veux - par exemple # HOSTNAME = zug va se transformer en # HOSTNAME = fred, mais je ne veux le "#" principal. Le premier exemple sed prend en charge des cas comme celui-ci.

Répondre

2

Essayez:

sed 's/.*\(HOSTNAME=\)/\1fred/' /etc/sysconfig/network 

Ou

sed 's/.*\(HOSTNAME=\).*/\1fred/' /etc/sysconfig/network 
+0

Alors que la deuxième forme ne fait bien ce que je veux - j'espère encore trouver un moyen de répéter l'espace de travail dans la sortie - en espérant utiliser la commande 'c' au lieu de la commande 's' comme indiqué dans la question. Cependant, s'il n'y a pas d'autre réponse, alors ce sera la réponse acceptée. – JohnnyLambada

+0

Vous pouvez déplacer la correspondance de la commande 's' à l'adresse, mais cela n'est pas nécessaire dans ce cas simple. Voici à quoi cela ressemblerait: 'sed '/.*\(HOSTNAME=\).*/ s // \ 1fred /'/etc/sysconfig/network' Le' c \ ',' a \ 'et' i \ 'ne fonctionnent qu'avec du texte littéral, ils ne font pas de * substitutions * - c'est à cela que sert la commande' s /// '. –

+0

Ok, assez bien - merci! – JohnnyLambada

Questions connexes