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 ?


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"

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 .


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/'

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

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

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

Je ne pense pas qu'une vérification explicite pour bbb , cccet dddest tout à fait ce que l'OP avait à l' esprit.
spinup
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.