it-swarm-tr.com

Bir borudan dize için ilk [x] karakteri yakalama

Bir komuttan gerçekten uzun çıktım varsa (tek satır), ancak çıktının yalnızca ilk [x] (diyelim 8) karakterini istediğimi biliyorum, bunu almanın en kolay yolu nedir? Herhangi bir sınırlayıcı yok.

67
xenoterracide

Bunun bir yolu cut kullanmaktır:

 command | cut -c1-8

Bu size her bir çıktı satırının ilk 8 karakterini verecektir. cut POSIX'in bir parçası olduğundan, çoğu Unice'de olması muhtemeldir.

95
Steven D

Bunlar sadece ilk 8 karakteri almanın diğer bazı yollarıdır.

command | head -c8

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

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

Ve eğer bashın varsa

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

parametre genişletme kullanarak bir başka astar çö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
2

Yeterince gelişmiş bir Kabuğunuz varsa (örneğin, Bash'de aşağıdakiler işe yarar, çizgi hakkında emin değilim) yapabilirsiniz:

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

read ... <(command) yürütüldükten sonra karakterleriniz REPLY Shell değişkeninde olacaktır. Diğer seçenekler hakkında bilgi edinmek için help read Yazın.

Açıklama: read için -n8 Argümanı 8 karaktere kadar istediğimizi söylüyor. -d$'\0' Yeni satır yerine boş değere kadar okunur diyor. Bu şekilde, önceki karakterlerden biri yeni satır olsa bile (8 değeri boş değilse) okuma 8 karakter için devam eder. -n8 -d$'\0' 'A alternatif, tam olarak 8 karakter veya stdin EOF'a ulaşana kadar okuyan -N8' I kullanmaktır. Hiçbir sınırlayıcı onurlandırılmaz. Bu muhtemelen ihtiyaçlarınızı daha iyi karşılar, ancak -N Ve -n 'İ onurlandırmak yerine kaç $ merminin -d Onuruna sahip olduğunu bilmiyorum. Açıklamaya devam ederek: -r, \ - önemsenmediğini söylüyor. Böylece, örneğin, \\ Yerine tek bir \.

Son olarak, command | read ... Yerine read ... <(command) yapıyoruz, çünkü ikinci formda okuma, daha sonra hemen okuduğunuz bilgileri kaybederek bir alt kabukta yürütülür.

Başka bir seçenek, tüm işleminizi alt kabuk içinde yapmaktır. Örneğin:

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

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 sorus vardır.

1
user79743

Manuel olarak maven deposunda sağlama toplamı dosyaları oluştururken bu sorun vardı. Ne yazık ki cut -c her zaman çıktının sonunda yeni satır yazdırır. xxd kullandığımı bastırmak için:

command | xxd -l$BYTES | xxd -r

Tam olarak çıkıyor $BYTES bayt, command 'ın çıkışı daha kısa değilse, o zaman tam olarak bu çıktı.