Comment remplacer une ligne entière par sed?

132

Supposons que j'ai un fichier avec des lignes

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 un fichier avec quelques lignes comme suit:

aaa = bbb
aaa = ccc
aaa = ddd
aaa = [autre chose]

Comment puis-je remplacer toutes ces lignes aaa=[something]en aaa=xxxutilisant sed ?

Michael
la source
2
Est-ce que [something else]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
c'est plus une question regex pas une question sed.
saferJo

Réponses:

217

Essaye ça:

sed "s/aaa=.*/aaa=xxx/g"
John Doyle
la source
4
Force d'habitude, il peut être ignoré dans ce cas - il est utilisé comme un remplacement global de la ligne pour remplacer chaque correspondance plutôt que juste la première. Dans ce cas, cependant, seul le premier sera mis en correspondance en raison de la .*.
John Doyle
1
Michael J.Barber, gremplacez toutes les instances de regexp par remplacement
A-IV
116

Vous pouvez également utiliser la ligne de changement de sed pour ce faire:

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

Cela passera par et trouvera toutes les lignes qui réussissent le aaa=test, 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 de n'obtenir que les lignes qui commencent par, aaa=mais c'est à vous de décider .

M. T
la source
12
OS X seddoit cêtre 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'.
Lri
Voici un exemple dans la documentation sed de la fonctionnalité de changement / remplacement que @Mr. T parle.
gene_wood
C'est le plus proche de faire ce qui a été demandé ... (mais la version de Lri est nécessaire pour la portabilité)
Gert van den Berg
42

Comme ça:

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

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

sed 's/^aaa=.*/aaa=xxx/'
Michael J. Barber
la source
1
Et si je veux remplacer par aaa = 'xxxx'. J'ai essayé de m'échapper, sed 's/aaa=.*/aaa=\'xxx\'/'mais cela ouvre une >invite dans une nouvelle ligne ...
Nagev
2

Si vous souhaitez utiliser, awkcela fonctionnerait aussi

awk -F= '{$2="xxx";print}' OFS="\=" filename
jaypal singh
la source
2
sed -i.bak 's/\(aaa=\).*/\1"xxx"/g' your_file
Vijay
la source
0

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
potong
la source
Je ne pense pas qu'une vérification explicite pour bbb , cccet dddest tout à fait ce que l'OP avait à l' esprit.
spinup