2017-07-25 2 views
1

Dans sed, comment puis-je faire un remplacement de motif quand une ligne ne contient pas certains motifs?
Je sais comment le faire en vi ou vim.
Par exemple, pour remplacer « lapin » à « lièvre » lorsque la ligne ne contient pas « animal », je peux fairedans sed, comment faire une substitution de modèle seulement quand un autre modèle n'existe pas

:g!/animal/s/rabbit/hare/g 

Je veux faire la même chose pour des centaines de fichiers dans un répertoire en utilisant foreach , trouver et sed. Lorsque la ligne ne contient pas '= (Dtype)', je veux remplacer 'Dtype val1 = expression;' à 'Dtype val1 = (Dtype) (expression);'. Mais en excluant des cas comme 'Dtype * pval = expression;'. C'est-à-dire, je veux mettre (Dtype) le moulage pour des assignations de non-pointeur. J'ai essayé

>foreach i (`find . -name \*.c`) 
? sed -e 'g!/ = (Dtype)/s/Dtype \([a-z].*\) = \(.*\);/Dtype \1 = (Dtype)(\2);/g' $i >! tmp 
? mv tmp $i 
? end 

Mais ce 'g!/Modèle/s/patter1/pattern2/g' ne fonctionne pas dans sed. Quelle est la bonne commande?

+1

voir https://stackoverflow.com/documentation/sed/3120/address-and-address-range#t=201707250606219921435 – Sundeep

+0

@Sundeep Bonjour, votre référence est dans la documentation. Comment puis-je le rechercher? séparément dans la section Documentation? –

+1

Copie possible de [Comment remplacer globalement les chaînes dans les lignes ne commençant pas par un certain modèle] (https://stackoverflow.com/questions/4953738/how-to-globally-replace-strings-in-lines-not-starting- with-a-certain-pattern) – Sundeep

Répondre

2

Cela pourrait fonctionner pour vous (GNU sed):

sed '/animal/!s/rabbit/hare/g' file 

Rechercher animal et si elle ne se trouve pas remplacer rabbit par hare au niveau mondial.

+0

Qu'est-ce que GNU spécifique ici? – SLePort

+0

Merci, en fait je connaissais la réponse mais je n'ai pas trouvé la réponse l'autre jour sur stackoverflow, alors posez une question pour que les autres puissent obtenir de l'aide. :) –