Apakah ada cara untuk mengatakan sed
untuk mengganti pola pada setiap kejadian kedua? Atau setidaknya di setiap baris kedua? (Tentu mungkin dengan skrip, tapi saya bertanya pada diri sendiri apakah sed
bisa melakukannya).
Edit
saya menemukan
sed -e "s/pattern/replacement/g;n"
Tapi itu menggantikan setiap kejadian pertama, bukan yang kedua.
Contoh
File input:
I have a pattern in each line
Also the second line has the pattern
Another pattern here
And -- you guess it -- a pattern
Output yang diinginkan:
I have a pattern in each line
Also the second line has the replacement
Another pattern here
And -- you guess it -- a replacement
sed -e 'n;s/2004-2009/6e législature/g'
yang memecahkan masalah saya.Akan mengganti kemunculan kedua pada setiap baris yang memiliki pola.
jika Anda memiliki GNU
sed
:Mulai dari baris satu
1
, baris setelah itu akan ditambahkan ke ruang polaN
kemudians
perintah akan menggantikan kemunculan pola kedua. kemudiansed
akan memindahkan dua baris ke bawah~2
dan ulangi.sumber
code
(sed '1 ~ 2s / pola / penggantian /')Interpretasi sederhana:
Pada baris pertama yang berisi setidaknya satu kemunculan POLA Anda ingin mengabaikannya dan mencetak garis apa adanya. Pada baris kedua yang berisi setidaknya satu kejadian POLA Anda ingin mengganti instance POLA pertama dengan PENGGANTIAN. Pada baris ketiga yang berisi setidaknya satu kemunculan POLA Anda ingin mencetak garis apa adanya. Pada baris keempat yang berisi setidaknya satu kejadian POLA Anda ingin mengganti instance POLA pertama dengan PENGGANTIAN. Dan seterusnya. Garis yang tidak cocok dengan POLA harus dicetak tanpa perubahan.
Ini dapat dengan mudah dilakukan dengan Sed seperti:
Atau, dengan spasi lebih sedikit dan label lebih pendek:
EDIT: Saya hanya membaca ulang pertanyaan dan melihat interpretasi yang lebih sulit:
Ganti kemunculan kedua POLA di seluruh dokumen dengan PENGGANTIAN, apakah itu terjadi pada baris yang sama dengan kemunculan pertama atau tidak. Biarkan kejadian pertama dan ketiga tidak berubah. Dll
Saya percaya ini bisa dilakukan dengan Sed juga, meskipun JAUH lebih rumit dan saya percaya itu tergantung pada ekspresi reguler yang akan digunakan. Saya akan mencoba mengerjakan sesuatu dan mempostingnya, tetapi saya akan membiarkan jawaban ini bertahan dengan versi sederhana di atas untuk saat ini.
sumber
t
est Anda denganq
uit dan ambil input seperti,{ sed '...'; cat; } <input
hanya untuk satu penggantianAnda sangat dekat, lewati saja baris pertama:
Mengapa harus
awk
menjadi alat yang lebih baik dalam kasus ini?sumber
Satu pola simbol dalam satu baris: sed 's / (a [^ a] *) a / \ 1c / g'
Setiap pola kedua (hanya satu pola yang cocok per baris dapat muncul. Jika dua atau lebih kecocokan per satu baris akan muncul, hanya yang kedua akan diganti)
sumber