このようなファイルがあります。
サンプル1.txt
ABCDE10998909
10898990XYZ
1898772222YGH
8980000000000sihgj
出力:
ABCD
ファイルの最初の行の最初の4文字を取得して変数に入れる必要があります。
答え1
使用head
とcut
:
$ variable=$( head -n 1 sample1.txt | cut -c 1-4 )
$ printf 'variable is %s\n' "$variable"
variable is ABCD
を使用して最初の行を抽出し、をhead
使用して最初の4文字を切り取りますcut
。一部の実装では、cut
最初の4つを返すことがあります。バイト最初の4つの代わりに数値(例:GNU cut
)。これは、データがマルチバイト文字を使用する場合に影響します。
使用sed
:
$ variable=$( sed 's/^\(....\).*/\1/;q' sample1.txt )
$ printf 'variable is %s\n' "$variable"
variable is ABCD
sed
最初の行の最初の4文字を使用して置き換え、修正されたsed
行を出力して終了します。
最初の行に4文字未満が含まれている場合、両方のバリアントは4文字未満を生成します。
あなたの質問にタグが付けられました。歴史 Unix。以前のシェルでは、より現代的で合理的なシェルを使用するのではなく、sh
バックティック()を使用してコマンドを置き換える必要があります。`...`
$(...)
答え2
私が想定している過去のUNIXまたは最新のシェルがサポートされていないと仮定すると、bash
POSIX互換の方法でこれを行うことができます。
if IFS= read -r line 2> /dev/null < file; then
result="${line%"${line#????}"}"
printf '%s\n' "$result"
else
printf >&2 '%s\n' 'Unable to read file contents or no newline found in the file'
fi
答え3
GNU grep
(または互換性)ソリューション:
variable=$(grep -o -m1 '^....' file.txt)
どこ
-o
出力のみ一致-m1
1ゲーム後に停止^
行の始まり....
ランダムな文字、4回
メモ:
-o
最初の行の最初の4文字のうち少なくとも4つを報告する非標準のGNU拡張(現在の他の実装によってサポートされています)。- つまり、最初の行に4文字があり、5行目の場合、その行の最初の4文字が報告されます。
答え4
ここで言及したので、最初の行の最初の4文字を変数に保存する必要があります。
command
variable=`awk 'NR==1{print substr($0,1,4)}' filename`
出力
variable=`awk 'NR==1{print substr($0,1,4)}' filename`
echo $variable
ABCD