sed dengan beberapa ekspresi untuk argumen in-place

24

Saya mencoba mengganti beberapa kata dalam file dengan menggunakan sed -i #expression1 #expression2

mengajukan

Something  123 item1
Something  456 item2
Something  768 item3
Something  353 item4

Output (Diinginkan)

anything  123 stuff1
anything  456 stuff2
anything  768 stuff3
anything  353 stuff4

Uji coba

Saya bisa mendapatkan output berikut dengan menggunakan sed -i2 kali.

 sed -i 's/Some/any/g' file
 sed -i 's/item/stuff/g' file

Dapatkah saya memiliki cara yang memungkinkan untuk menjadikan ini sebagai perintah tunggal di tempat seperti

sed -i 's/Some/any/g' -i 's/item/stuff/g' file

Ketika saya mencoba kode di atas dibutuhkan s/item/stuff/gsebagai file dan mencoba mengerjakannya ..

JigarGandhi
sumber
Jika file Anda mirip dengan contoh di atas (yaitu mereka mengikuti pola yang sama) Anda dapat melakukannya dengan substitusi tunggal:sed - i 's/Some\(.*\)item/any\1stuff/' file
don_crissti

Jawaban:

26

Tergantung pada versi sedpada sistem Anda, Anda mungkin dapat melakukannya

sed -i 's/Some/any/; s/item/stuff/' file

Anda tidak perlu gsetelah slash terakhir pada sperintah di sini, karena Anda hanya melakukan satu penggantian per baris.

Kalau tidak:

sed -i -e 's/Some/any/' -e 's/item/stuff/' file

The -ipilihan memberitahu sedke mengedit file di tempat; jika ada karakter segera setelah -iitu sedbuat cadangan file asli dan gunakan karakter tersebut sebagai ekstensi file cadangan. Misalnya,

sed -i.bak 's/Some/any/; s/item/stuff/' file

atau

sed -i'.bak' 's/Some/any/; s/item/stuff/' file

akan memodifikasi file, menyimpan aslinya ke file.bak.

Tentu saja, pada sistem Unix (atau Unix-like), kita biasanya menggunakan '~' daripada '.bak', jadi

sed -i~ 's/Some/any/;s/item/stuff/' file
PM 2Ring
sumber
2
Perhatikan bahwa Anda sedang mendeskripsikan varian GNU. Varian BSD (seperti pada FreeBSD atau OS / X) memerlukan argumen untuk -i. Jadi sed -i '' 's/a/b/;s/c/d/' fileatau sed -i .back 's/a/b/;s/c/d/'atau sed -i.back 's/a/b/;s/c/d/'ada. sedImplementasi lain umumnya tidak mendukung -i.
Stéphane Chazelas
Terima kasih @ StéphaneChazelas untuk mengklarifikasi itu. Dan saya kira saya seharusnya lebih eksplisit dalam mengatakan bahwa di GNU tidak ada ruang antara -idan ekstensi.
PM 2Ring
sed -i 's/$username = "root"/$username = "newuser"/; s/$password = "password"/$password = "passwd"/; s/$dbname="handicraftstore"/$dbname="handicraft"' Web/database.phpresults sed: -e expression #1, char 141: unterminated s '
command`
@alhelal Maaf, komentar bukanlah tempat yang tepat untuk mengajukan pertanyaan. Tapi bagaimanapun, sperintah terakhir Anda tidak ada di bagian akhir /.
PM 2Ring
@ PM2Ring karena saya tidak melihat bahwa saya kira itu terkait solusi Anda. Namun terima kasih.
alhelal
10

Anda dapat mengaitkan ekspresi sed dengan ";"

%sed -i 's/Some/any/g;s/item/stuff/g' file1
%cat file1
anything  123 stuff1
anything  456 stuff2
anything  768 stuff3
anything  353 stuff4
Ian McGowan
sumber
5

Ekspresi berganda menggunakan banyak -eopsi:

sed -i.bk -e 's/Some/any/g' -e 's/item/stuff/g' file

atau Anda dapat menggunakan hanya satu:

sed -i.bk -e 's/Some/any/g;s/item/stuff/g' file

Anda harus memberikan ekstensi untuk file cadangan, karena ketika beberapa implementasi sed, seperti OSX sed tidak bekerja dengan ekstensi kosong (Anda harus menggunakan sed -i ''untuk mengganti file asli).

cuonglm
sumber
1

Anda dapat menggunakan Vim dalam mode Ex:

ex -sc '%s/Some/any/|%s/item/stuff/|x' file
  1. % pilih semua garis

  2. s pengganti

  3. x Simpan dan tutup

Steven Penny
sumber