Bir dize için ilk [x] karakterini bir borudan kapma


Yanıtlar:


82

Bir yol kullanmaktır cut:

 command | cut -c1-8

Bu size her çıktı satırının ilk 8 karakterini verecektir. Yana cutPOSIX'e bir parçası, en Unix'lerde olması muhtemeldir.


3
cut -cKarakterleri seçtiğini unutmayın ; cut -bveya head -cbaytları seçer. Bu, bazı yerel ayarlarda fark yaratır (pratikte UTF-8 kullanırken).
Gilles 'SO- kötü olmayı'

Bu durumda başlangıç ​​dizinini de belirtmeniz gerekmez. Söylemek cut -c-81 ile 8 arasındaki karakterleri seçecektir.
Sparhawk

@Steven, cutWindows'taki eşdeğeri?
Pacerier

Ayrıca command | dd bs=8 count=1 2>/dev/null. Daha kısa ya da üstün olduğunu söylemiyorum. Sadece başka bir alternatif.
dubiousjim

@Gilles fakat GNU güncel sürümleri ile dikkat cut, cut -cgibi çalışır cut -b(yani, çoklu bayt karakterler için düzgün çalışmıyor).
Stéphane Chazelas

24

Bunlar sadece ilk 8 karaktere ulaşmanın başka yolları.

command | head -c8

command | awk '{print substr($0,1,8);exit}' 

command | sed 's/^\(........\).*/\1/;q'

Ve eğer bash varsa

var=$(command)
echo ${var:0:8}

2
Bence aşağıdaki sed formülasyonunu okumak biraz daha kolay: command | sed 's/\(.\{8\}\).*/\1/'ya da sed'iniz destekliyorsa command | sed -r 's/(.{8}).*/\1/':; Aksi takdirde, +1
Steven D

İyi şeyler, ama karakterleri değil, baytlarıhead -c sayan not . Benzer şekilde, başlıca Awk uygulamaları arasında, yalnızca GNU awk çoklu bayt karakterlerini doğru şekilde işler - FreeBSD Awk ve Mawk yoktur.
mklement0

2

Yeterince gelişmiş bir kabuğunuz varsa (örneğin, aşağıdakiler, çizgi üzerinde emin değil Bash'te çalışır), şunları yapabilirsiniz:

read -n8 -d$'\0' -r <(command)

Çalıştırdıktan sonra read ... <(command)karakterleriniz kabuk değişkeninde olacaktır REPLY. Tip help readdiğer seçenekler hakkında bilgi edinmek için.

Açıklama: -n8Argüman read8 karaktere kadar istediğimizi söylüyor. -d$'\0'Bir boş dek yerine bir satır okunduğu diyor. Bu yolla, önceki karakterlerden biri yeni satır olsa bile 8 karakter devam eder (ancak boş değilse). Alternatif olarak -n8 -d$'\0', -N8tam 8 karakter okuyan veya stdin EOF'a ulaşana kadar kullanmaktır. Hiçbir sınırlayıcı onurlandırılmaz. Muhtemelen ihtiyaçlarınızı daha iyi uyuyor, ama ben onur bir okuma var hazırlıksız kaç kabukları bilmiyorum -Nonurlandıran aksine -nve -d. Açıklamaya devam etmek: -ryoksaymak \-escapes diyor , böylece, örneğin, \\tek bir karakter yerine iki karakter gibi davranıyoruz \.

Son olarak, yaptığımız read ... <(command)ziyade command | read ...çünkü ikinci formda, okuma sadece okumak bilgileri kaybetmeden, daha sonra hemen çıkılır bir kabuktaki yürütülür.

Başka bir seçenek de tüm işlemlerinizi deniz kabuğunun içerisinde yapmaktır. Örneğin:

$ echo abcdefghijklm | { read -n8 -d$'\0' -r; printf "REPLY=<%s>\n" "$REPLY"; }
REPLY=<abcdefgh>

1
Sadece 8 karakterin çıktısını almak istiyorsanız ve onları kabukta işlemeniz gerekmiyorsa, sadece kullanın cut.
dubiousjim

Bilmek iyi read -n <num>; küçük uyarı: Bash 3.x (işletim sistemi üzerinde hala güncel olan) yanlışlıkla <num>bir bayt sayısı olarak yorumlanır ve bu nedenle çok baytlık karakterlerle başarısız olur; bu, Bash 4.x'te düzeltildi.
mklement0

Bu harika ve faydalı bir cevap. Diğerlerinden çok daha genel.
not2qubit

2

Parametre genişletme kullanarak başka bir liner çözümü

echo ${word:0:x}

EG: word="Hello world"
echo ${word:0:3} or echo ${word::3} 
o/p: Hel


EG.2: word="Hello world"
echo ${word:1:3}
o/p: ell

Uzunluğu tutan bir değişkeni de kullanabilirsiniz, örneğin: x=8; echo ${word:0:$x}tamsayıyı kodlamak yerine.
Cometsong

1

Bu taşınabilir:

a="$(command)"             # Get the output of the command.
b="????"                   # as many ? as characters are needed.
echo ${a%"${a#${b}}"}      # select that many chars from $a

Değişken uzunlukta bir karakter dizisi oluşturmak için burada kendi soru var .


0

Ben maven deposunda checksum dosyaları el ile oluştururken bu sorunu yaşadım. Ne yazık ki, cut -cher zaman çıktı sonunda yeni bir satır yazdırır. Kullandığımı bastırmak için xxd:

command | xxd -l$BYTES | xxd -r

Çıktı kısalmazsa, tam olarak bu çıktısı alır, tam olarak $BYTESbayt commandçıkarır.


Başka bir yöntem, çıkarmak için cutyetişemiyeceği yeni satır içine pip için:| tr -d '\n'
Cometsong
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.