Bagaimana cara mengganti seluruh baris dengan sed?

132

Misalkan saya punya file dengan garis

aaa = bbb

Sekarang saya ingin menggantinya dengan:

aaa = xxx

Saya dapat melakukannya sebagai berikut:

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

Sekarang saya punya file dengan beberapa baris sebagai berikut:

aaa = bbb
aaa = ccc
aaa = ddd
aaa = [sesuatu yang lain]

Bagaimana saya bisa mengganti semua baris ini aaa=[something]dengan aaa=xxxmenggunakan sed ?

Michael
sumber
2
Apakah [something else]teks literalnya, atau apakah itu hanya penampung? Apa format yang memungkinkan setelah tanda sama dengan?
ean5533
itu lebih dari pertanyaan regex bukan pertanyaan sed.
saferJo

Jawaban:

217

Coba ini:

sed "s/aaa=.*/aaa=xxx/g"
John Doyle
sumber
4
Dalam hal kebiasaan, ini dapat diabaikan dalam kasus ini - ini digunakan sebagai pengganti global untuk saluran untuk mengganti setiap pertandingan, bukan hanya yang pertama. Dalam hal ini meskipun hanya yang pertama yang akan cocok karena .*.
John Doyle
1
Michael J. Barber, gganti semua instance dari regexp dengan penggantian
A-IV
116

Anda juga dapat menggunakan baris perubahan sed untuk mencapai ini:

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

Ini akan melewati dan menemukan baris yang lulus aaa=tes, yang berarti bahwa baris berisi huruf-huruf aaa=. Kemudian ia mengganti seluruh baris dengan aaa = xxx. Anda dapat menambahkan ^di awal tes untuk memastikan Anda hanya mendapatkan garis yang dimulai aaa=tetapi itu terserah Anda.

Tuan T
sumber
12
OS X sedmembutuhkan cuntuk diikuti oleh garis miring terbalik dan baris baru, dan tidak menambahkan baris baru untuk teks disisipkan, tetapi Anda dapat menggunakan misalnya $'/aaa=/c\\\naaa=xxx\n'.
Lri
Berikut dan contoh di sed dokumentasi tentang perubahan / ganti fitur yang @Mr. T sedang berbicara tentang.
gene_wood
Ini adalah yang paling dekat dengan benar-benar melakukan apa yang diminta ... (Tapi versi Lri diperlukan untuk portabilitas)
Gert van den Berg
42

Seperti ini:

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

Jika Anda ingin menjamin bahwa aaa=ini ada di awal baris, buat:

sed 's/^aaa=.*/aaa=xxx/'
Michael J. Barber
sumber
1
Bagaimana jika saya ingin mengganti dengan aaa = 'xxxx'. Saya mencoba melarikan diri seperti sed 's/aaa=.*/aaa=\'xxx\'/'tetapi itu membuka >prompt di baris baru ...
Nagev
2

Jika Anda ingin menggunakan awkmaka ini akan berhasil juga

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

Ini mungkin bekerja untuk Anda:

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
sumber
Saya tidak berpikir pemeriksaan eksplisit untuk bbb, cccdan dddcukup apa yang OP yang ada dalam pikiran.
spinup