Saya punya daftar file:
./a.temp.txt ./a.temp.txt
./a/b.temp.txt ./a/b.temp.txt
./a/b/c.temp.txt ./a/b/c.temp.txt
Dan saya ingin menghapus temp.
pada setiap baris, tetapi hanya kejadian kedua , dengan demikian, file tersebut akan terlihat seperti:
./a.temp.txt ./a.txt
./a/b.temp.txt ./a/b.txt
./a/b/c.temp.txt ./a/b/c.txt
Bagaimana saya harus melakukan ini?
Jawaban:
Secara umum Anda dapat mencocokkan kemunculan Nth dari sesuatu yang menggunakan
\zs
dan\{N}
. Ada contoh yang diberikan di:help \zs
.Dalam kasus Anda, perintahnya adalah:
sumber
%s/\v(.{-}\zstemp.){2}//
Ini lebih mudah dilakukan dengan
sed
:Dengan Vim Anda membutuhkan pencocokan non-serakah, dan tidak mudah untuk memperpanjang metode untuk menggantikan ke-3, ke-4, dll
temp
. Tapi itu bisa dilakukan jika Anda bersikeras:sumber
sed
berlaku skrip untuk setiap baris input pada gilirannya.sed
seperti halnya Anda dapat menyalurkannya ke program lain. Fi::%!sed 's/\.temp\././2'
.sed
di UNIX-friendly, ia membaca input daristdin
dan menulis hasilnyastdout
.Anda juga dapat melakukan ini dengan melihat di belakang.
Jika Anda ingin menghapus SEMUA kejadian setelah yang pertama, Anda dapat menambahkan
g
tanda di bagian akhir.\(\)\@<=
Akan mencari pola apa pun di antara\(
dan\)
tetapi tidak akan menambahkan teks yang ditemukan ke kecocokan.Lihat
:h \@<=
untuk info lebih lanjut.sumber
Anda dapat menggunakan makro seperti yang disarankan @Meshpi. Tetapi, ini adalah cara lain Anda dapat mencapai hal yang sama.
Dan, maka Anda bisa mengulanginya sampai akhir. Dan, akan ada lebih banyak cara untuk melakukan hal yang sama.
sumber
Solusi ini mirip dengan TessellatingHeckler tetapi lebih mudah disesuaikan dengan pola apa pun yang harus dihapus.
Begini cara kerjanya:
:g/temp\./
untuk setiap baris yang cocok dengan "temp."normal
jalankan perintah berikut dalam mode normal2n
temukan arus kedua polanyagn
pilih itud
dan hapus.Ini akan bekerja untuk pola apa pun yang diberikan
:g
.normal
dapat disingkat menjadinorm
.gnd
setara dengandgn
. Sunting: Faktanya2ngnd
setara dengand2gn
.Lihat Vim Tips Wiki untuk lebih banyak contoh perintah global.
sumber
Di Vim, Anda dapat menentukan kolom sebelum / di / setelah yang Anda inginkan pencocokan Anda terjadi dengan
:help \%c
:Ini akan menghilangkan setiap yang
.temp
ditemukan setelah kolom 17 dari setiap baris dalam buffer saat ini.Catatan 1:
/g
tidak perlu dengan sampel Anda.Catatan 2: Saya sering menggunakan fitur praktis itu dengan qmv . Direkomendasikan!
sumber
vidir
danvipe
dari paket moreutils .Ini sebenarnya cukup sederhana. Untuk mencocokkan temp kedua, izinkan apa pun yang diikuti oleh "temp" diikuti oleh apa pun, lalu cari temp lagi.
The
\zs
berarti "Start seleksi sini" sehingga bagian pertama dari pertandingan (segala sesuatu sebelum suhu kedua) tidak dihilangkan. Ini sebenarnya fitur yang sangat berguna yang baru saja saya pelajari! Tanpa itu, regex harus terlihat seperti ini:sumber
temp
pada satu baris resep Anda menghapus yang terakhir, bukan yang kedua. Salahkan keserakahan. :)My case was to match old filename to new filename, so only 2 occurrences will be on each line. And only the second one should change
.Alih-alih regex, saya akan pergi dengan perintah yang tidak:
temp
dan jalankan di setiap baris:
NB.
^[
khusus dan mewakili penekanan tombol Escape; Anda mengetiknya dengan:Ctrl-q <Esc>
Tetapi opsi regex, yang saya pikir belum disarankan, adalah untuk mencocokkan
temp.
diikuti oleh apa pun kecuali a.
, berlabuh ke akhir baris.Yang akan cocok
temp.txt
di akhir baris dan menggantinya dengan hanyatxt
bit.sumber
Saya akan menulis makro dengan kursor mulai dari kiri atas.
qq4f.dfpq
Lalu saya akan memilih sisa baris menggunakan
V
dan menjalankan makro pada baris tersebut dengan:'<,'>norm!@q
Ini hanya akan berfungsi jika format teks tetap sama sehubungan dengan jumlah titik sebelum temp kedua.
sumber
n
bukannya4f.
karena jika nama file memiliki lebih banyak titik, makro Anda bisa gagal atau menghapus hal-hal yang tidak boleh dihapus.Tidak ada yang mencegah Anda menggunakan dua regex alih-alih hanya satu, yaitu mengubah kemunculan pertama dan kemudian menukar kolom:
Mungkin tidak terlalu pintar tapi saya merasa sangat mudah dibaca.
sumber
Usaha saya
sumber