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 ?


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"

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.


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

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

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

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

Saya tidak berpikir pemeriksaan eksplisit untuk bbb, cccdan dddcukup apa yang OP yang ada dalam pikiran.
spinup
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.