Wie ersetze ich eine ganze Linie durch sed?


132

Angenommen, ich habe eine Datei mit Zeilen

aaa = bbb

Jetzt möchte ich sie ersetzen durch:

aaa = xxx

Ich kann das wie folgt machen:

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

Jetzt habe ich eine Datei mit ein paar Zeilen wie folgt:

aaa = bbb
aaa = ccc
aaa = ddd
aaa = [etwas anderes]

Wie kann ich ersetzen alle diese Zeilen aaa=[something]mit aaa=xxxVerwendung sed ?


2
Ist [something else]der wörtliche Text oder ist das nur ein Platzhalter? Was ist das mögliche Format der Sache nach dem Gleichheitszeichen?
ean5533

Das ist eher eine Regex-Frage, keine Sed-Frage.
sichererJo

Antworten:


216

Versuche dies:

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

4
Die Gewohnheit der Gewohnheit kann in diesem Fall ignoriert werden - sie wird als globaler Ersatz für die Linie verwendet, um jedes Spiel und nicht nur das erste zu ersetzen. In diesem Fall wird jedoch nur die erste aufgrund der abgeglichen .*.
John Doyle

1
Michael J. Barber, gersetzen Sie alle Instanzen von Regexp durch Ersatz
A-IV

115

Sie können auch die Änderungslinie von sed verwenden, um dies zu erreichen:

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

Dadurch werden alle Zeilen gefunden, die den aaa=Test bestehen. Dies bedeutet, dass die Zeile die Buchstaben enthält aaa=. Dann ersetzt es die gesamte Zeile durch aaa = xxx. Sie können ^zu Beginn des Tests ein hinzufügen , um sicherzustellen, dass Sie nur die Zeilen erhalten, die mit beginnen, aaa=aber das liegt bei Ihnen.


12
Auf OS X sedmuss cein Backslash und eine Newline folgen, und es wird keine Newline an den eingefügten Text angehängt, aber Sie können sie beispielsweise verwenden $'/aaa=/c\\\naaa=xxx\n'.
Lri

Hier ist ein Beispiel in der sed-Dokumentation der Änderungs- / Ersetzungsfunktion , die @Mr. T spricht über.
gene_wood

Dies ist der nächste Schritt, um das zu tun, was gefragt wurde ... (Aber Lris Version wird für die Portabilität benötigt)
Gert van den Berg

42

So was:

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

Wenn Sie sicherstellen möchten, dass das aaa=am Anfang der Zeile steht, machen Sie es:

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

1
Was ist, wenn ich durch aaa = 'xxxx' ersetzen möchte? Ich habe versucht zu entkommen, sed 's/aaa=.*/aaa=\'xxx\'/'aber das öffnet eine >Eingabeaufforderung in einer neuen Zeile ...
Nagev

2

Wenn Sie verwenden möchten, awkwürde dies auch funktionieren

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

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

0

Dies könnte für Sie funktionieren:

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

Ich glaube nicht , eine explizite Prüfung auf bbb, cccund dddist ganz das, was die OP im Sinne hatte.
Spinup
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.