回答:
1つの方法は使用することcut
です:
command | cut -c1-8
これにより、出力の各行の最初の8文字が表示されます。cut
はPOSIXの一部であるため、ほとんどのUnicesに存在する可能性があります。
cut -c
文字を選択することに注意してください。cut -b
またはhead -c
バイトを選択します。これにより、一部のロケールで違いが生じます(実際には、UTF-8を使用する場合)。
cut -c-8
8に文字1から選択されます
cut
Windowsでの同等のものは?
command | dd bs=8 count=1 2>/dev/null
。それが短いまたは優れていると言っていない。ちょうど別の選択肢。
cut
にcut -c
動作することに注意してくださいcut -b
(つまり、マルチバイト文字に対しては正しく動作しません)。
これらは、最初の8文字のみを取得する他の方法です。
command | head -c8
command | awk '{print substr($0,1,8);exit}'
command | sed 's/^\(........\).*/\1/;q'
そして、あなたがbashを持っている場合
var=$(command)
echo ${var:0:8}
command | sed 's/\(.\{8\}\).*/\1/'
または、sedがそれをサポートしている場合:command | sed -r 's/(.{8}).*/\1/'
; それ以外の場合、+ 1
head -c
数えることに注意してください。同様に、主要なAwk実装の中で、GNU awk のみがマルチバイト文字を正しく処理します-FreeBSD AwkとMawkは正しく処理しません。
十分に高度なシェルを使用している場合(たとえば、以下はBashで機能しますが、ダッシュについてはわかりません)、次のことができます。
read -n8 -d$'\0' -r <(command)
実行後read ... <(command)
、キャラクターはシェル変数に入れられますREPLY
。入力help read
して、他のオプションについて学習します。
説明:への-n8
引数read
は、最大8文字が必要であることを示しています。ザ・は-d$'\0'
ヌルまでではなく、改行を読み語ります。この方法では、以前の文字の1つが改行であっても、その文字がNULLでない場合でも、8文字の間読み取りが続行されます。代わりに-n8 -d$'\0'
、を使用して-N8
、正確に8文字を読み取るか、stdinがEOFに達するまで読み取ります。区切り文字は使用されません。それはおそらく、もっと自分のニーズに合った、私は名誉読んだぶっきらぼうどのように多くのシェルがわからない-N
敬うとは対照的に、-n
そしてを-d
。説明を続けます:-escapesを-r
無視し\
ます。たとえば、\\
単一の文字としてではなく、2つの文字として扱い\
ます。
最後に、我々はやるread ... <(command)
のではなくcommand | read ...
ので、二番目の形式で、読み取りはあなただけ読んで情報を失う、その直後に終了しサブシェルで実行されます。
別のオプションは、サブシェル内ですべての処理を実行することです。例えば:
$ echo abcdefghijklm | { read -n8 -d$'\0' -r; printf "REPLY=<%s>\n" "$REPLY"; }
REPLY=<abcdefgh>
cut
。
read -n <num>
。小さな警告:Bash 3.x(OSの現在)は誤っ<num>
てバイトカウントとして解釈するため、マルチバイト文字で失敗します。これはBash 4.xで修正されました。
これは移植可能です:
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
文字の可変長の文字列を構築するには、ここで独自の質問があります。
Mavenリポジトリでチェックサムファイルを手動で生成すると、この問題が発生しました。残念ながらcut -c
、出力の最後に常に改行が出力されます。私が使用することを抑制するにはxxd
:
command | xxd -l$BYTES | xxd -r
の出力が短く$BYTES
なければ、正確にそのバイトcommand
を出力します。
cut
の末尾の改行をにそれをピップすることです:| tr -d '\n'