2013-08-20 6 views
2

J'ai vu tellement de questions à propos de la commande sed mais aucune ne correspond à mon mec.sed: remplace une ligne contenant un motif

Je souhaite remplacer toute la ligne contenant un motif.

Je pense que la commande sed est la meilleure option. J'ai commencé avec cette commande sed mais ne fonctionne pas

sed -i 's/pattern/Substitution/' myfile.txt 

Après que je teste avec cette autre commande mais remplacer uniquement le motif, pas la ligne.

echo "hello y luego bye" | sed "s|hello|adeu|g" 

Répondre

10

Vous devez faire correspondre toute la ligne contenant ce motif, puis le remplacer. Utilisez comme ceci:

sed 's/^.*\bpattern\b.*$/Substitution/' file 

J'ai aussi ajouté \b pour les limites de mots de sorte que vous ne correspondez pattern mais évitez correspondant patterns.

Explication:^.*\bpattern\b.*$ Utilisée pour vérifier que la ligne entière correspond à un modèle contenant. ^ est le début de la ligne et $ est la fin de la ligne. .* correspond à 0 texte ou plus. Donc ^.* apparait tout le texte avant pattern et .*$ fait correspondre tout le texte après pattern.

En utilisant awk vous pouvez faire:

awk '!/affraid/{print} /affraid/{print "Substitution"}' file 
+0

Merci, fonctionne parfaitement. Mais pouvez-vous expliquer quel est le sens de '^. *' Avant le modèle et '. * $' Après? Merci d'avance. –

+0

Et je ne comprends pas votre explication pour \ b, cause sans \ b fonctionne bien. –

+1

'\ b' est utilisé pour les limites de mots. Avec '\ b', la chaîne de correspondance sera:' ^. * Pattern. * $ 'Et elle peut aussi correspondre à une ligne par exemple:' 123 mypatterns foo' mais quand j'ai utilisé '^. * \ Bpattern \ b. * $' It ne correspondra pas à cette ligne. – anubhava

Questions connexes