Bagaimana saya bisa mengganti teks setelah kata tertentu menggunakan sed?

12

Saya memiliki file bernama .ignore. Perlu diganti projdir. Sebagai contoh:

ignore \..*
ignore README
projdir Snake

Saya perlu mengganti Snake dengan, misalnya, "PacMan". Saya membaca halaman manual, tetapi saya tidak tahu harus berbuat apa.

Jakub Baski Gabčo
sumber

Jawaban:

18

Cari baris yang dimulai dengan projdir, dan ganti seluruh baris dengan yang baru:

sed -i 's/^projdir .*$/projdir PacMan/' .ignore

^dan $merupakan penanda awal / akhir garis, sehingga polanya akan cocok dengan seluruh garis; .*cocok dengan apa pun. The -imemberitahu seduntuk menulis perubahan secara langsung .ignore, bukan hanya mengeluarkannya

Michael Mrozek
sumber
5

Salah satu pendekatan adalah menulis ulang seluruh baris, menggunakan referensi kembali untuk bagian yang ingin Anda pertahankan:

sed -e 's/^\( *projdir  *\)[^ ]*\(.*\)*$/\1PacMan\2/'

Pendekatan lain adalah menulis ulang bagian dari baris tersebut, tetapi hanya jika beberapa bagian lainnya cocok:

sed -e '/^ *projdir / s/ [^# ]/ PacMan/'

Kedua contoh menulis ulang kata dipisahkan spasi putih pada baris di mana kata pertama berada projdir.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
3

Meskipun ini adalah pos lama dan tampaknya dipecahkan untuk Anda dengan jawaban yang diterima, pertanyaan sebenarnya belum dijawab. Jadi untuk kelengkapan dan untuk membantu orang lain:

Di sini jawaban yang benar-benar cocok untuk "Ular" dan bukan untuk garis yang dimulai dengan "projdir" ...

sed -r 's/(^.*)Snake/\1PacMan' .ignore

Ini menggantikan semuanya dari awal baris termasuk "Snake" dengan semuanya sebelum "Snake" + "PacMan". \ 1 adalah singkatan dari apa yang cocok di dalam (). Semuanya setelah "Ular" tetap tidak tersentuh.

moritz
sumber
1
sed -i 's:^projdir.*$:projdir PacMan:g' .ignore

^ projdir adalah untuk menemukan baris yang dimulai dengan string projdir. The. * $ Di sana adalah singkatan dari string after projdir pada baris yang sama. String projdir PacMan adalah string yang kami gantikan. g adalah untuk global - untuk mengganti semua baris yang dimulai dengan projdir. .ignore adalah nama file

Tinu
sumber
1
Bisakah Anda memperluas jawaban Anda dan menjelaskan apa itu?
Romeo Ninov
Jawaban jauh lebih berguna jika mereka menyertakan penjelasan untuk bagaimana dan mengapa suatu perintah atau sepotong kode berfungsi.
Anthony Geoghegan
Saya harap ini lebih bermanfaat setelah diedit
Tinu