2010-01-25 6 views
3

Je dois remplacer toutes les occurrences de: 5.6xx et 5.5xx (où x est un 0-9 digit) sur un fichier texte avec 5.500, mais seulement lorsque la ligne qui contient la correspondance commence par une chaîne (par exemple STARTSTRING). Cela signifieBasic Regexp Question: Comment modifier uniquement les lignes commençant par une STRING avec sed

STARTSTRING 5.610 4.500 3.550 5.530 
OTHERSTRING 5.600 5.500 5.500 5.600 

devrait devenir

STARTSTRING 5.500 4.500 3.550 5.500 
OTHERSTRING 5.600 5.500 5.500 5.600 

Je ne sais pas comment je peux le faire. J'utilise sed pour l'édition.

Merci beaucoup! :)

PS: Si nécessaire, je cours la dernière version de Debian.

Répondre

3
sed -i -e '/^STARTSTRING/s/5\.[56][0-9][0-9]/5.500/g' file 
+0

C'était exactement ce que je cherchais. Merci beaucoup :) –

+0

Pas de problème. Bonne chance! –

+0

peut-être vous devriez mettre une limite dans les numéros de cas comme 35.530 se présente et vous ne voulez pas changer cela. – ghostdog74

0
sed -i -e '/^STARTSTRING/s/5\.[56][0-9]{2}/5.500/g' $file 
+0

Le vôtre ne fait pas ce que le PO demandait. –

+0

En effet, mal lu, concentré uniquement sur le correspondant seulement certaines lignes, fixe – wich

1

vous pouvez utiliser awk ainsi

$ cat file 
STARTSTRING 5.610 4.500 3.550 5.530 35.530 
OTHERSTRING 5.600 5.500 5.500 5.600 35.500 

$ awk '/STARTSTRING/{ for(i=1;i<=NF;i++) if($i ~/^5\.[56][0-9][0-9]/) $i="5.500"} 1 ' file 
STARTSTRING 5.500 4.500 3.550 5.500 35.530 
OTHERSTRING 5.600 5.500 5.500 5.600 35.500 

Notez que les solutions sed ne prend pas soin de nombres comme 35,530.

Questions connexes