Come sostituire un'intera linea con sed?


132

Supponiamo che io abbia un file con linee

aaa bbb =

Ora vorrei sostituirli con:

aaa = xxx

Posso farlo come segue:

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

Ora ho un file con poche righe come segue:

aaa bbb =
aaa ccc =
aaa = ddd
aaa = [qualcos'altro]

Come posso sostituire tutte queste linee aaa=[something]con l' aaa=xxxutilizzo di sed ?


2
Il [something else]testo è letterale o è solo un segnaposto? Qual è il possibile formato della cosa dopo il segno di uguale?
ean5533,

questa è più una domanda regex che una domanda sed.
SaferJo

Risposte:


217

Prova questo:

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

4
Forza dell'abitudine, in questo caso può essere ignorato: viene utilizzato come sostituto globale della linea per sostituire ogni corrispondenza anziché solo la prima. In questo caso, però, solo il primo verrà abbinato a causa del .*.
John Doyle,

1
Michael J. Barber, gsostituisci tutte le istanze di regexp con la sostituzione
A-IV,

116

Puoi anche usare la linea di cambiamento di sed per ottenere questo risultato:

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

Questo passerà attraverso e troverà tutte le righe che superano il aaa=test, il che significa che la riga contiene le lettere aaa=. Quindi sostituisce l'intera riga con aaa = xxx. Puoi aggiungere ^a all'inizio del test per assicurarti di ottenere solo le righe che iniziano aaa=ma dipende da te.


12
OS X sedrichiede cdi essere seguito da una barra rovesciata e un ritorno a capo, e non aggiunge un ritorno a capo al testo inserito, ma si può usare per esempio $'/aaa=/c\\\naaa=xxx\n'.
Lri,

Ecco un esempio nella documentazione di sed della funzione di modifica / sostituzione che @Mr. T sta parlando.
gene_wood,

Questo è il più vicino a fare effettivamente ciò che è stato chiesto ... (Ma la versione di Lri è necessaria per la portabilità)
Gert van den Berg

42

Come questo:

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

Se vuoi garantire che il punto aaa=sia all'inizio della linea, fallo:

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

1
E se volessi sostituirlo con aaa = 'xxxx'. Ho provato a fuggire come, sed 's/aaa=.*/aaa=\'xxx\'/'ma questo apre un >prompt in una nuova riga ...
Nagev

2

Se si desidera utilizzare, anche awkquesto funzionerebbe

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

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

0

Questo potrebbe funzionare per te:

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

Non credo che un controllo esplicito per bbb, ccce dddè proprio quello che il PO aveva in mente.
spinup,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.