Jak zamienić całą linię na seda?

138

Załóżmy, że mam plik z liniami

aaa = bbb

Teraz chciałbym je zastąpić:

aaa = xxx

Mogę to zrobić w następujący sposób:

sed „s / aaa = bbb / aaa = xxx / g”

Teraz mam plik z kilkoma wierszami w następujący sposób:

aaa = bbb
aaa = ccc
aaa = ddd
aaa = [coś innego]

Jak mogę wymienić wszystkie to linie aaa=[something]z aaa=xxxkorzystając sed ?

Michał
źródło
2
Czy [something else]tekst dosłowny, czy to tylko symbol zastępczy? Jaki jest możliwy format rzeczy po znaku równości?
ean5533
to jest bardziej pytanie o wyrażenie regularne, a nie sedno.
saferJo

Odpowiedzi:

228

Spróbuj tego:

sed "s/aaa=.*/aaa=xxx/g"
John Doyle
źródło
4
Siła przyzwyczajenia, w tym przypadku można ją zignorować - jest używana jako globalny zamiennik linii, aby zastąpić każde dopasowanie, a nie tylko pierwsze. W tym przypadku jednak tylko pierwszy zostanie dopasowany z powodu .*.
John Doyle
1
Michael J. Barber, gzamień wszystkie wystąpienia wyrażenia regularnego na zastąpienie
A-IV
121

Możesz także użyć linii zmiany seda, aby to osiągnąć:

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

Spowoduje to wyświetlenie wszystkich wierszy, które przejdą aaa=test, co oznacza, że ​​wiersz zawiera litery aaa=. Następnie zastępuje cały wiersz aaa = xxx. Możesz dodać ^na początku testu, aby upewnić się, że otrzymasz tylko te wiersze, które zaczynają się od, aaa=ale to zależy od Ciebie.

Pan T.
źródło
13
OS X sedwymaga codwrotnego ukośnika i nowej linii i nie dołącza nowej linii do wstawionego tekstu, ale możesz użyć na przykład $'/aaa=/c\\\naaa=xxx\n'.
Lri,
Oto przykład w dokumentacji sed zmiany / zamiany funkcji, która @Mr. T mówi.
gene_wood,
Jest to najbliżej faktycznie robi to, co został poproszony ... (Ale wersja LRI jest potrzebna do przenoszenia)
Gert van den Berg
43

Lubię to:

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

Jeśli chcesz mieć pewność, że znak aaa=znajduje się na początku linii, zrób to:

sed 's/^aaa=.*/aaa=xxx/'
Michael J. Barber
źródło
1
A jeśli chcę zastąpić aaa = 'xxxx'. Próbowałem uciec, sed 's/aaa=.*/aaa=\'xxx\'/'ale to otwiera znak >zachęty w nowej linii ...
Nagev
2

Jeśli chcesz użyć, awkto też zadziała

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

To może Ci pomóc:

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
źródło
Nie sądzę wyraźny czek bbb, ccci dddto całkiem co OP miał na myśli.
spinup