sed, yeni satır karakterini kaldıramıyor


12

sedOldukça uzun süredir kullanıyorum , ancak çözemediğim bir tuhaflık var.

Asıl durumla ilgili sorunumu açıklayayım.


Sahne 1

printf "ls" | xclip -selection clipboard
echo "ls" | xclip -selection clipboard

İlk komutta, printfçıktıyı xclippanoya kopyalanacak şekilde yönlendiriyorum. Şimdi, printfaksine echo, varsayılan olarak sonunda yeni bir satır eklemez. Bu nedenle, bu içeriği terminale yapıştırırsam ls, kopyalanan komut otomatik olarak çalışmaz.

İkincisi, sonunda yeni bir satır var, bu yüzden pano içeriğini yapıştırmak da komutun panodaki çalışmasına neden olur.

Bu benim için istenmeyen bir durum. Bu yüzden, yeni satırı kullanarak kaldırmak istedim sed, ancak aşağıdaki sahnede açıklandığı gibi başarısız oldu.

Sahne # 2

echo "ls" | sed -r 's/\n//g' | xclip -selection clipboard

Panodaki içerik hala yeni satır içeriyor. Terminale yapıştırdığımda, komut otomatik olarak çalışır.

Ayrıca satır başı karakterini kaldırmayı denedim \r. Ama nada. Burada çok önemli / basit bir şey eksik gibi görünüyor.

Yanıtlar:


16

sedyolunu sınırlayacak \newlines - onlar her zaman girişine çıkarıldı ve çıkışına tekrar geçirilir. Orada asla bir \nbir içinde ewline karakter sedyapmış olduğunuz bir düzenleme sonucu meydana gelmedi desen alanı. Not: GNU hariç sed'ın -zmodu ...

Sadece kullanın tr:

echo ls | tr -d \\n | xclip -selection clipboard

Veya daha iyisi, sedtamamen unutun :

printf ls | xclip -selection clipboard

Bu , çoğu durumda istenmeyen tüm yeni satırları kaldıracaktır generate-text | xclip. Bu cevap yalnızca son satırsonu kaldırılır.
Tom Hale

7

Sed dahil olmak üzere birçok metin işleme aracı, satırsonu karakteri hariç olmak üzere satırın içeriği üzerinde çalışır. Bir satırı işlerken sed'in yaptığı ilk şey, satırsonu satır sonunu kaldırmaktır, daha sonra komut dosyasındaki komutları yürütür ve yazdırırken son satırsonu ekler. Bu nedenle, yeni satırı sed ile kaldıramazsınız.

Tüm yeni satırları kaldırmak için şunu kullanabilirsiniz tr:

echo "ls" | tr -d '\n' | xclip


4

Sed'deki yeni satırları -z seçeneğini ileterek değiştirebilirsiniz .

sed -z 's/\n/ /g'

Sed man sayfası:

-z, - boş veri satırları NUL karakterle ayır


Bu , genellikle durumda istenmeyen tüm yeni satırları kaldıracaktır | xclip.
Tom Hale

2

Sadece panoya komutlar veriyorsanız

echo -n "ls " | xclip -selection clipboard

Ek olarak daha karmaşık dönüşümler yapmanız gerekiyorsa,

echo "ls  " | perl -pe 's/\n//' | xclip -selection clipboard

Hmm. Pürüzsüz çözüm. Belki de regex için perl veya python'a geçmenin zamanı geldi.
shivams

3
@shivams - perlve pythonher ikisi de çok daha yavaş daha seddoğru kullanıldığında olabilir. Bununla birlikte, doğru kullanmayı öğrenmek anahtardır.
mikeserv

@mikeserv - Kabul ediyorum; oneliner sed için özel harika. Dönüşümler daha karmaşık hale gelecekse, perl / python / gawk'u tercih ederim.
JJoao

1
@JJoa: Tercihiniz size ait, ancak sedyalnızca tek gömleklerinizi halletmekten çok daha fazlasını yapabilir ve muhtemelen bahsettiğiniz diğer araçlardan daha hızlı yapabilir.
15'te mikeserv

1
@mikeserv - bir kez daha, sana katılıyorum. Bir yıl önce sed (20000 s /.../.../) 'de sed tarafından yazılmış bir çeviri sistemi EN-PT vardı. Ve işe yaradı! Daha sonra diziler, karmalar, fonksiyonlar, paketler ve CPAN'a sahip olmak Perl oldu.
JJoao

1

Yalnızca son satırsonu kaldırmak için aşağıdakileri yapın :

sed -z '$ s/\n$//'

sedBir eklemez \0sınırlayıcı olarak ayarlanırsa o zaman akışının sonuna kadar NULüzeri -zbir POSIX metin dosyası oluşturmak için ise (a içinde amaçla belirlenen \nbir nihai daima çıkış, olacaktır) \nolmadan -z.

Örneğin:

$ { echo foo; echo bar; } | sed -z '$ s/\n$//'; echo tender
foo
bartender

Ve hiçbir kanıt kanıtlamak için NUL:

$ { echo foo; echo bar; } | sed -z '$ s/\n$//' | xxd
00000000: 666f 6f0a 6261 72                        foo.bar

Birden fazla sondaki yeni satırı kaldırmak için aşağıdakileri yapın :

sed -Ez '$ s/\n+$//'
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.