2012-01-11 8 views
61

Supposons que j'ai un fichier avec des lignesComment remplacer la ligne entière avec sed?

aaa=bbb

Maintenant, je voudrais les remplacer par:

aaa=xxx

Je peux le faire comme suit:

sed "s/aaa=bbb/aaa=xxx/g"

Maintenant, j'ai fichier avec quelques lignes comme suit:

aaa=bbb 
aaa=ccc 
aaa=ddd 
aaa=[something else]

Comment est-ce que je peux remplacer tous ces lignes aaa=[something] avec aaa=xxx en utilisant sed?

+1

Est-ce que [[quelque chose d'autre]] est le texte littéral, ou est-ce juste un espace réservé? Quel est le format possible de la chose après le signe égal? – ean5533

Répondre

111

Essayez ceci:

sed "s/aaa=.*/aaa=xxx/g" 
+2

à quoi sert le «g»? –

+2

Force de l'habitude, il peut être ignoré dans ce cas - il est utilisé comme un remplacement global de la ligne pour remplacer chaque match plutôt que seulement le premier. Dans ce cas, seul le premier sera mis en correspondance à cause du '. *'. –

+0

Michael J. Barber, 'g' remplace toute l'instance de regexp par un remplacement –

33

Comme ceci:

sed 's/aaa=.*/aaa=xxx/' 

Si vous voulez garantir que le aaa= est au début de la ligne, en font:

sed 's/^aaa=.*/aaa=xxx/' 
2

Si vous souhaitez utiliser awk alors cela fonctionnerait aussi

awk -F= '{$2="xxx";print}' OFS="\=" filename 
1

Cela pourrait fonctionner pour vous:

cat <<! | sed '/aaa=\(bbb\|ccc\|ddd\)/!s/\(aaa=\).*/\1xxx/' 
> aaa=bbb 
> aaa=ccc 
> aaa=ddd 
> aaa=[something else] 
! 
aaa=bbb 
aaa=ccc 
aaa=ddd 
aaa=xxx 
+0

Je ne pense pas qu'une vérification explicite de' bbb', 'ccc', et' ddd' est tout à fait ce que l'OP avait en tête. – spinup

2
sed -i.bak 's/\(aaa=\).*/\1"xxx"/g' your_file 
57

Vous pouvez également utiliser la ligne de changement de sed pour y parvenir:

sed -i "/aaa=/c\aaa=xxx" your_file_here 

Cela passera par et trouver toutes les lignes qui passent le test aaa=, ce qui signifie que la ligne contient les lettres aaa=. Ensuite, il remplace la ligne entière par aaa = xxx. Vous pouvez ajouter un ^ au début du test pour vous assurer que vous obtenez uniquement les lignes qui commencent par aaa= mais c'est à vous de décider.

+2

'sed' d'OS X requiert que' c' soit suivi d'une barre oblique inverse et d'une nouvelle ligne, et il n'ajoute pas de nouvelle ligne au texte inséré, mais vous pouvez utiliser par exemple '$ '/ aaa =/c \\\ naaa = xxx \ n''. – user495470

+1

Semble comme un bogue dans OSX sed à moi ... –

+2

OSX utilise BSD sed –

Questions connexes