Saya memiliki sejumlah file yang ingin saya perbarui dengan mengganti satu string multi-line dengan string multi-line lainnya. Sesuatu di sepanjang garis:
* Some text,
* something else
* another thing
Dan saya ingin menggantinya dengan:
* This is completely
* different text
Hasilnya adalah bahwa setelah penggantian file yang berisi blok teks pertama, sekarang akan berisi string kedua (sisa file tidak berubah).
Bagian dari masalahnya adalah saya harus menemukan daftar file yang akan diperbarui dalam sistem file. Saya kira saya dapat menggunakan grep untuk itu (meskipun sekali lagi itu tidak mudah dilakukan dengan string multiline) lalu pipa itu sed sed mungkin?
Apakah ada cara mudah untuk melakukan ini? Sed adalah pilihan tetapi canggung karena saya harus menambahkan \ n dll. Apakah ada cara untuk mengatakan "ambil input dari file ini, cocokkan di file-file itu, lalu ganti dengan konten dari file lain ini"? Saya dapat menggunakan python jika perlu, tetapi saya menginginkan sesuatu yang cepat dan sederhana, jadi jika ada utilitas yang tersedia, saya lebih suka menggunakannya daripada menulis skrip saya sendiri (yang saya tahu caranya).
some text, something else another thing
apakah itu mencakup beberapa baris atau tidak? Atau Anda hanya ingin mencocokkansome text,\nsomething else\nanotherthing
?Jawaban:
Ganti "Some ... \ n ... Thing" dengan isi file "baru" dalam satu atau lebih file input
-i
untuk mengubah input.txt secara langsung-p0
masukkan file file input dan cetak pada akhirnyas/regexp/.../s
di regexp.
adalah.|\n
s/.../exp/e
ganti denganeval(exp)
s/Some text\n...\n...thing\n/...
sumber
perl -i -p0e ' $b= `cat before`; s/$b/Some thing\n/se' input.txt ...
Saya khawatir Anda akan mengalami kesulitan menghasilkan solusi yang cocok untuk Anda sampai Anda menyelesaikan deskripsi masalah yang konkret - tapi itulah yang paling cocok untuk QA, seperti yang saya lihat. Mungkin ini akan memberi Anda ide - itu akan selalu menjaga 3 baris dalam ruang pola pada suatu waktu - dengan 2 baris lookahead - sambil meluncur maju melalui file input hanya satu baris pada suatu waktu.
Itu harus dapat mencocokkan string Anda apakah itu mencakup beberapa baris atau tidak - hingga tiga, yaitu. Tetapi tidak ada ketentuan untuk mencerminkan ketentuan itu dalam penggantian - itu selalu mencakup dua baris seperti yang tertulis.
sumber
Tidak kuat (karena jangan chech string kedua tetapi mudah untuk menyelesaikan) dan bisa tidak posix compilant tetapi sangat sederhana:
Perintah pertama menambahkan baris dari Beberapa teks sampai bertemu hal lain, kemudian baris kedua mengubahnya ke teks lain.
CATATAN Batasannya adalah bahwa beberapa teks harus selalu diikuti oleh hal lain .
sumber