シェルスクリプトの変数に出力するテキストファイルがあります。ただし、最初の50文字のみが必要です。
使用してみましたcat ${filename} cut -c1-50
が、最初の50文字をはるかに超えていますか?これはcut
行を探しているためかもしれません(100%確実ではありません)が、このテキストファイルは1つの長い文字列である可能性があります。
cat
コマンドから最初のX文字を取得するためにパイプできるユーティリティはありますか?
シェルスクリプトの変数に出力するテキストファイルがあります。ただし、最初の50文字のみが必要です。
使用してみましたcat ${filename} cut -c1-50
が、最初の50文字をはるかに超えていますか?これはcut
行を探しているためかもしれません(100%確実ではありません)が、このテキストファイルは1つの長い文字列である可能性があります。
cat
コマンドから最初のX文字を取得するためにパイプできるユーティリティはありますか?
回答:
head -c 50 file
これは、最初の50バイトを返します。
コマンドがすべてのOSで常に同じように実装されるわけではないことに注意してください。LinuxおよびmacOSでは、このように動作します。Solaris(11)では、/ usr / gnu / bin /にあるgnuバージョンを使用する必要があります
GNU coreutils 5.97
)はサポートしています。
-c
ただし、POSIXは有効なオプションとして定義されていないため、ローカル環境に完全に依存しています。unix.com/man-page/posix/1/head
dd status=none bs=1 count=50 if=${filename}
これは、最初の50バイトを返します。
status=none
、Ubuntu 14.04、coreutils 8.21を使用している場合には使用できますが2>/dev/null
、以前のバージョンを使用している場合は使用する権利があります。
read()
50バイトのいずれかを行います。場合はfile
、インスタンスと少ない文字のためのパイプが一度に利用可能である場合、少ないバイト数が返されます。と同等のものhead -c50
を使用するには、GNU固有のを使用する必要がありますiflag=fullblock
。
これまでのほとんどの回答では、1バイト= 1文字であると想定していますが、非ASCIIロケールを使用している場合はそうではありません。
それを行うためのもう少し堅牢な方法:
testString=$(head -c 200 < "${filename}") &&
printf '%s\n' "${testString:0:50}"
これが仮定することに注意してください:
ksh93
、bash
(または最近のzsh
かmksh
(でサポートされているのみで、マルチバイト文字セットにはかかわらず、mksh
UTF-8であり、唯一の後set -o utf8-mode
))とのバージョンhead
ことを裏付けている-c
(ほとんどが、今日やるが、厳密には標準ではありません)。locale charmap
およびそれfile -- "$filename"
を確認するため)。そうでない場合は、ieで設定します。LC_ALL=en_US.UTF-8
)head
すべての文字が最大4バイトでエンコードされる最悪のUTF-8を想定して、ファイルの最初の200バイトを取得しました。これは私が考えることができるほとんどの場合をカバーするはずです。head
、またはnōn-standard -c
オプションを追加する別の実装も想定しています。しかし、すでにGNU bashが必要です。(注:mksh
UTF-8エンコードファイルの場合、UTF-8モードでこれを行うことができます。)OPにオクテットまたはマルチバイト文字が必要かどうかを尋ねます。「文字」は漠然とした/古い用語です。
$filename
か$testString
、含まれていないか、またはで始まることを前提としています-
。
${var:offset:length}
あなたがここに使用している構造が、実際に来てからksh93
も、最近のバージョンでサポートされていますzsh
(zsh
それ自身を持っています$testString[1,50]
)。あなたは必要${testString:0:50}
にksh93
し、zsh
しかし。
grep -om1 "^.\{50\}" ${filename}
その他のバリアント(ファイルの最初の行用)
(IFS= read -r line <${filename}; echo ${line:0:50})
read
とecho
?またはbash expansion
?
grep
(regexp)、そして、はい、ここでのシェルの使用(ヒント:最初の行は大きいかもしれません)。(言われているように、bashismはPOSIXにもありませんが、ほとんどのシェルはそれを実装しています。)
head -c 50 file.txt
たとえば、file.txtの最初の50文字を出力します。
hexdump
16進文字として出力するために使用します。hexdump -n 50 -v file.bin
たとえば、file.binの最初の50バイトを出力します。
-v
詳細オプションを指定しないと、hexdump
繰り返される行が*
代わりにアスタリスク()に置き換えられることに注意してください。ここを参照してください:https://superuser.com/questions/494245/what-does-an-asterisk-mean-in-hexdump-output/494613#494613を。
このためにsedを使用すると、問題に非常に簡単に取り組むことができます
sed -e 's/^\(.\{50\}\).*/\1/' yourfile
sed -n -e '1s/^\(.\{50\}\).*/\1/p' ${filename}
|
?cat ${filename} | cut -c1-50