Sed'deki noktaların (.) Değiştirilmesi


9

Asıl soru şu ki - M-BM-başka karakterleri kaybetme riski olmadan özel karakteri nasıl kaldıracağınız hakkında bir fikri olan var mı?

Bir metin dizesi var:

" . . ."

yani

space dot space dot space dot

Metin dosyasında bu dizenin tüm oluşumunu değiştirmek için çalışıyorum

"..."

yani

dot dot dot

Sed ile yapmaya çalışıyordum:

sed -r 's:\s\.\s\.\s\.:...:g' -i sed-dots

Ne yazık ki, giriş dosyasını biraz değiştirmez. Dosya: https://www.dropbox.com/s/46zmiruy3ln85a1/sed-dots

Metin düzenleyicide aynı dizeyi değiştirmeye çalıştığımda (geany kullanıyorum) bulunur ve düzgün bir şekilde değiştirilir.

Düşünebilmemin tek nedeni, bu alanların bazılarının (veya hepsinin) gerçekten boşluklar değil, özel bir karakter olmasıdır.

Herkes bu dizeyi sed (veya başka bir komut satırı aracı) ile bulma ve değiştirme hakkında bir fikri var mı? Lütfen fikrimi dosyamda test et, çünkü sorun göründüğü kadar açık değil - bu yüzden sordum.

cat -ADosyamı kullandıktan sonra , bu boşlukların boşluk değil, M-BM-özel karakter olması sorun gibi görünüyor . .Arama için önerilen herhangi bir sembolün kullanılması iyi bir fikir değildir, çünkü diğer bazı karakterlerin kaldırılması riski vardır.

Yanıtlar:


10

İlk echoolarak sed, gerçek bir dosya kullanmaktan ziyade, bunu test ederek ve içine koyarak başlardım . İkinci olarak, {n}katları ve sınırları belirtmek için genişletilmiş normal ifade modelinde a kullanabilirsiniz .

Neredeyse oradaydınız ama normal ifadeniz önde gelen bir alan bekliyordu.

$ echo 'cheese . . . muffins' | sed -r 's/(\s?\.){3}/ dot dot dot/g'
cheese dot dot dot muffins

\s?Hala çıktıyı mahvetmek için yeterince açgözlü olduğunu unutmayın , bu yüzden çıktıya bir boşluk ekledim. Bunu istemeyebilirsiniz. Ayrıca alanı isteğe bağlı hale getirdim, bu yüzden aşağıdakilerin tümüyle eşleşecek:

...
. ..
.. .
. . .
 . . . 

Sadece isteğe bağlı ?bayrağı kaldırın .


Unicode ile ilgili probleminiz göz önüne alındığında (yorumlarda) verileri ASCII eşdeğerine zorlayabilir iconvve sonra silebilirsiniz:

$ iconv -f utf-8 -t ascii//translit sed-dots | sed -r 's/(\s?\.){3}/ dot dot dot/g'
Lorem ipsum dot dot dot
Some dot dot dot more text

echoEn azından bir dosyayı cat ettiğinizde, kabuğun hiçbir şeyi yorumlamadığını ve hiçbirinin yankı olmadığını bildiğinizde, bir dosyayı oluşturmak yerine kullanmanızı önermekten şaşırdım .
Mart'ta Flimm

@ Noktalar ile basit bir örnek için Flimm, bu gerçekten bir sorun değil. Bir dosyadan yükleyecekseniz, uğraşmayın cat- seddosyayı yüklemeniz yeterlidir (OP örneğine göre), ancak satır içi kaydetmeyin (kaldır -i, böylece çıktıyı görebilir ve test edebilirsiniz).
Oli

@Oli Örneğinizle çalışır, ancak dosyamla çalışmaz (soruma göre bir bağlantı var). Bu sorun - emriniz ve diğerleri çalışmalı, ancak bu noktalarla ilgili bir sorun olduğu için çalışmıyorlar. Lütfen komutumu dosyamda sınayın ve çalışmadığını göreceksiniz.
Mart'ta Rafal

1
@Rafal Eğer bakarsanız cat -A sed-dotsnoktalar arasındaki "boşlukların" özel M-BM- karakterler olduğunu görebilirsiniz ... Orada nasıl süründüklerinden emin değilim ama değiştirilmesi gerekiyor. Onları iyi hedefleyemezseniz, bu işe yarar: sed -r 's/(\s\..\..\.)/ dot dot dot/ig' sed-dots
Oli

@Oli Çalışır. Çok teşekkür ederim! Sözdizimini açıklayabilir misiniz? Herhangi bir yan etkisi olmadığından ve başka bir şeyin yerini almayacağından emin misiniz? Gördüğüm kadarıyla, bu RegExp noktalardan sonra herhangi bir karakterle eşleşecek. Ancak, M-BM bir karakter değil, üçtür. Öyleyse nasıl çalışır?
Rafal

0

Tüm "." Yerine "." İfadesini değiştirmek için aşağıdakileri deneyin.

sed -r 's/\. /\./g' -i sed-dots

Ama için ". . ." "..."

sed -r 's/\. \. \./\.\.\./g' -i sed-dots

0

Ben üzerinden koştu zaman dosyanızı kullanabilirsiniz:

tr '\240' ' ' < sed-dots.txt > sed-dots.new

Bu, bir dönüşüm adımı olmadan işe yaradı:

sed 's/[[:blank:]]\.[[:blank:]]\.[[:blank:]]\./.../g' sed-dots.txt

İşe yaramıyor. Sanırım bu sebep @Oli'nin bulduğu garip M-BM karakteri.
Rafal
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.