Bash (veya belirli olmak gerekirse wc -l < log.txt
) komutları yürüttüğümde , çıktıdan sonra satır sonu içeriyor. Ondan nasıl kurtulurum?
Bash (veya belirli olmak gerekirse wc -l < log.txt
) komutları yürüttüğümde , çıktıdan sonra satır sonu içeriyor. Ondan nasıl kurtulurum?
Yanıtlar:
Beklenen çıktınız tek bir satırsa , tüm yeni satır karakterlerini çıktıdan kaldırabilirsiniz. 'Tr' yardımcı programına veya tercih edilirse Perl'e yöneltilmesi nadir değildir:
wc -l < log.txt | tr -d '\n'
wc -l < log.txt | perl -pe 'chomp'
Sondaki yeni satırı kaldırmak için komut değiştirme özelliğini de kullanabilirsiniz:
echo -n "$(wc -l < log.txt)"
printf "%s" "$(wc -l < log.txt)"
Lütfen OP'nin kabul edilen cevabı seçme kararına katılmadığımı unutmayın. Mümkün olan yerlerde 'xargs' kullanmaktan kaçınmak gerektiğine inanıyorum. Evet, havalı bir oyuncak. Hayır, burada ihtiyacınız yok.
Beklediğiniz çıktıda birden fazla satır varsa, başka bir karar vermeniz gerekir:
MULTIPLE satırsonu karakterlerini dosyanın sonundan kaldırmak istiyorsanız, yine cmd yerine kullanın:
printf "%s" "$(< log.txt)"
SON satırsonu karakterini bir dosyadan kesinlikle kaldırmak istiyorsanız Perl kullanın:
perl -pe 'chomp if eof' log.txt
Kaldırmak istediğiniz bir satırsonu karakteriniz olduğundan eminseniz, son bayt dışındaki her şeyi seçmek için GNU coreutils'den 'head' kullanabilirsiniz. Bu oldukça hızlı olmalı:
head -c -1 log.txt
Ayrıca, eksiksizlik için, 'cat' ve 'tümünü göster' bayrağını kullanarak yeni satırınızın (veya diğer özel) karakterlerin dosyanızda hızlı bir şekilde kontrol edebilirsiniz. Dolar işareti karakteri her satırın sonunu gösterir:
cat -A log.txt
tr --delete '\n'
.
| tr -d '\r'
Tek yön:
wc -l < log.txt | xargs echo -n
echo -n `wc -l log.txt`
IFS
) bir boşluğa sıkıştırır . Örnek echo "a b" | xargs echo -n
:; echo -n $(echo "a b")
. Bu, kullanım durumu için bir sorun olabilir veya olmayabilir.
-e
, seçenek olarak yorumlanacaktır echo
. Kullanımı her zaman daha güvenlidir printf '%s'
.
xargs
sistemimde çok yavaş (ve diğer sistemlerde de olduğundan şüpheleniyorum), bu yüzden printf '%s' $(wc -l log.txt)
daha hızlı olabilir, çünkü printf
genellikle yerleşiktir (Ayrıca bilgi yönlendirmesi olmadığı için). Asla backtick kullanmayın, yeni POSIX sürümlerinde kullanımdan kaldırıldı ve birçok dezavantajı var.
Bash değişken ikamesinde beyaz boşlukların çıkarılması için doğrudan destek de vardır :
testvar=$(wc -l < log.txt)
trailing_space_removed=${testvar%%[[:space:]]}
leading_space_removed=${testvar##[[:space:]]}
trailing_linebreak_removed=${testvar%?}
Çıktısını bir değişkene atarsanız, bash
boşlukları otomatik olarak şeritler:
linecount=`wc -l < log.txt`
printf sizin için sondaki yeni satırı zaten keser:
$ printf '%s' $(wc -l < log.txt)
Detay:
%s
dize yer tutucu yerine yazdırır . %s\n
) yazdırmasını söylemezseniz , olmaz."$(command)"
, dahili yeni satırlar korunur ve yalnızca sondaki yeni satır kaldırılır. Kabuk burada tüm işleri yapıyor - printf
sadece komut değiştirme sonuçlarını tekrar yönlendirmenin bir yoludur stdout
.
$( )
yapı ile yapan kabuk . İşte kanıt:printf "%s" "$(perl -e 'print "\n"')"
$ printf '%s' "$(wc -l < log.txt)"
Yalnızca son satırsonu kaldırmak istiyorsanız , aşağıdakileri yapın:
sed -z '$ s/\n$//'
sed
Bir eklemez \0
sınırlayıcı olarak ayarlanırsa o zaman akışının sonuna kadar NUL
üzeri -z
bir POSIX metin dosyası oluşturmak için ise (a içinde amaçla belirlenen \n
bir nihai daima çıkış, olacaktır) \n
olmadan -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+$//'
sed
sağlamıyor -z
.
Bash'te herhangi bir şeyin çıktısını satır sonu olmadan yazdırmak istiyorsanız, -n
anahtarla yankılanırsınız .
Eğer zaten bir değişkene sahipseniz, sondaki yeni satır kırpılmış olarak yankılanır :
$ testvar=$(wc -l < log.txt)
$ echo -n $testvar
Veya bunun yerine tek bir satırda yapabilirsiniz:
$ echo -n $(wc -l < log.txt)
echo -n $(wc -l < log.txt)
aynı etkiye sahiptir.