Bu soruya bakıyordum ve sonra tamamen
POSIX
kullanan cevabımı
sed
nasıl uygulayabileceğimi merak ettim .ex
İşin püf noktası sed
, tam olarak eşdeğer olup olmadıklarını görmek için tutma alanını desen alanı ile karşılaştırabilirken (ile
G;/^\(.*\)\n\1$/{do something}
), böyle bir test yapmanın hiçbir yolunu bilmiyorum ex
.
Ben Vim ben olabileceğini biliyor Y
ilk satırı ank ve sonra yazın
:2,$g/<C-r>0/d
için neredeyse ben belirterek-ama yaşıyorum yapmak ilk satır bir şey içeriyor, ancak satır olarak atılmış ediliyor beri çok basit alfanümerik metin bu, gerçekten riskli hale gelirse
regex , sadece karşılaştırma için bir dize değil. (Ve ilk satırda eğik çizgi varsa, satırın geri kalanı komut olarak yorumlanır!)
Dolayısıyla myfile
, ilk satırla aynı olan ancak ilk satırı silemeyen tüm satırları silmek istersem bunu nasıl yapabilirim ex
? Bu nedenle, bunu nasıl yapabilirim vi
?
Başka bir satırla tam olarak eşleşiyorsa bir satırı silmenin POSIX yolu var mı?
Belki de bu hayali sözdizimi gibi bir şey:
:2,$g/**lines equal to "0**/d
<C-r>0
çok iyi buluyorum . Özel karakterleri korumanız gerektiğinden, yalnızca Ex komutlarıyla daha iyisini yapabileceğinizden emin değilim. POSIX uyumlu kısıtlama olmadan ben çok nomagic anahtarını kullanacağını düşündüğünüz \V
ve (hatta onun özel bir anlam tutar çünkü o zaman ters eğik çizgi koruyacağını \V
birlikte) escape()
olan 2 argüman kaçmak isteyen tüm karakterleri içeren bir dize / koruma olduğu işlevin .
:execute '2,$g/\V' . escape(getline(1), '\/') . '/d'
Veya desen noktalı virgül için noktalı virgül gibi başka bir karakter kullanabilirsiniz. Bu durumda, desendeki bir eğik çizgiyi korumanız gerekmez. Şöyle bir şey verir::execute '2,$g;\V' . escape(getline(1), '\') . ';d'
sed
da çok iyi buluyorum . Vim ile, genellikle belirli özel görevleri diğer programlara devredersiniz ve sed
muhtemelen bunun iyi bir örneğidir. Bu arada, sed
tüm tamponunuzda koşmanıza gerek yok. Arabelleğin yalnızca bir bölümünde çalıştırmak istiyorsanız, bir aralık verebilirsiniz. Eğer 50 ile 100 arasındaki tek satırları filtrelemek istiyorsanız Örneğin, siz yazabilirsiniz: :50,100!<your sed command>
.
:execute '2,$g/\V' . escape(getline(1), '\') . '/d'