Bagaimana saya bisa mendapatkan perintah sed saya untuk membuat perubahan permanen ke file?

32

Apakah ini mungkin? Saya membaca di suatu tempat bahwa perintah berikut akan melakukannya:

sed -e [command] [file]

tetapi tampaknya melakukan hal yang sama dengan adil

sed [perintah] [file]

(itu tidak menyimpan perubahan). Apakah ada cara untuk melakukan ini dengan menggunakan sed?

John
sumber
2
The -ebendera singkatan ekspresi. Anda mungkin menginginkan -ibendera yang artinya in-placedan saya sangat menyarankan Anda untuk menggunakan sed -i.bak 's/../' filename
Valentin Bajrami

Jawaban:

50

Saya pikir Anda mencari -i:

   -i[SUFFIX], --in-place[=SUFFIX]

          edit files in place (makes backup if SUFFIX supplied)

Sebagai contoh:

$ cat foo.txt
hello world
$ sed -i 's/o/X/g' foo.txt
$ cat foo.txt
hellX wXrld

Jika Anda memberikan akhiran, itu akan membuat file cadangan:

$ ls
foo.txt
$ sed -i.bak 's/o/X/g' foo.txt 
$ ls
foo.txt  foo.txt.bak

File input dimodifikasi dan cadangan yang berisi data file asli dibuat.

Perhatikan juga bahwa ini untuk GNU sed, ada sedikit perbedaan dalam format antara sedimplementasi yang berbeda .

terdon
sumber
4
Perhatikan bahwa halaman manual salah. sedtidak melakukan pengeditan di tempat. Ini menciptakan file baru dan menimpa yang lama, perubahan inode.
Marco
2
@ Marco Itu cara aman mengedit file di tempat. “Mengedit file pada tempatnya” dalam dokumentasi sed berarti bahwa file asli (sebagaimana didefinisikan oleh namanya) dimodifikasi, bukan bahwa file asli (sebagaimana didefinisikan oleh inode) dimodifikasi.
Gilles 'SANGAT berhenti menjadi jahat'
2
@Gilles Saya sangat setuju bahwa ini adalah cara yang disukai untuk mengedit file, tetapi saya jarang menyebutnya di tempat . Tapi itu bermuara pada pertanyaan tentang bagaimana file diidentifikasi, dengan inode atau dengan nama. Saya akan mengatakan dengan inode, jika tidak konstruksi seperti { rm file; cmd > file; } < fileakan mengarah pada kesimpulan bahwa cmd membaca dan menulis ke file yang sama, yang tidak. Ada dua file berbeda yang kebetulan memiliki nama yang sama. Tetapi saya tidak ingin memulai diskusi di sini.
Marco
Di macOS 10.14 saya dapatkan sed: 1: "foo.txt": invalid command code fketika menjalankan sed -i 's/o/X/g' foo.txt. Namun, memberikan ekstensi, seperti sed -i .bak 's/o/X/g' foo.txtberfungsi dengan baik. Ada ide bagaimana membuatnya bekerja tanpa membuat file cadangan?
Joshua Pinter
1
Oke, temukan jawabannya. Di macOS Anda perlu secara eksplisit menambahkan string kosong untuk opsi param extension:sed -i '' 's/o/X/g' foo.txt
Joshua Pinter
2

Solusi ini berfungsi untuk HPUX (UNIX):

1 { rm test1.sh && awk '{gsub("Error", "NO_Error", $0); print}' > test1.sh; } < test1.sh.:

2. perl -pi -e 's/Error/NO_Error/g' test1.sh

3. sed 's/Error/NO_Error/g' test1.sh | tee test1.sh

pengguna3114790
sumber
Anda tidak dapat menggunakan tee askubuntu.com/a/752451
Steven Penny
1

-eopsi untuk mengeksekusi banyak sedperintah

sed -e 's/linux/unix/' -e 's/os/OS/' file.txt

pertimbangkan file.txtsebagai

linux os

maka O / P adalah

unix os

-i opsi menyimpan perubahan secara permanen ...

pengguna195318
sumber