ファイルがあります。
gretting: hello the world
gretting: good morning
gretting: good evening
Gbye: goodbye
Gbye: see you
変数を割り当てます
var = grep -E -i "greeting"
varはグリーティングの3行と同じです。
var = "gretting: hello the world
gretting: good morning
gretting: good evening"
varを各行に分割し、それを別の変数(たとえばtemp1
.. temp2
)に割り当てるにはどうすればよいですか?
temp1 = "gretting: hello the world
temp2 = "gretting: good morning
temp3 = "gretting: good evening"
ありがとう
答え1
モードでデフォルトの-E
正規表現構文を拡張正規表現構文に切り替えるオプション。E
にはgretting
デフォルトまたは拡張正規表現演算子がないため、違いはなく、-E
固定-F
文字F
列を使用することもできます。
POSIX に似たシェルの最初の 3 行を 3 つの異なるシェル変数に割り当てるには、次の手順を実行します。
readln() for _var; do IFS= read -r "$_var"; done
grep -Fi gretting file | readln temp1 temp2 temp3
ただし、基本的にbash
パイプラインの一番右の部分を含むいくつかのシェルはサブシェルで実行されているため、パイプラインのサイズを変更するとこれらの変数が失われるため、同じパイプラインコンポーネントで実行する必要があります。以下で使用してください。
grep -Fi gretting file | {
readln temp1 temp2 temp3
do-something-with "$temp1" "$temp2" "$temp3"
}
またはkshスタイルを使用してください。
readln temp1 temp2 temp3 < <(grep -Fi gretting file)
またはYashから:
readln temp1 temp2 temp3 <(grep -Fi gretting file)
grep
バックグラウンドで実行され、出力は現在のシェルのパイプから読み取られます。
GNU実装を使用するとgrep
。これがなければ続行されますが、戻り時にパイプが壊れた後に追加の一致を出力すると、最終的にSIGPIPEによって終了する可能性があります。-m3
grep
grep
readln
¹オプションが有効になっていない限り(対話など)、shopt -s lastpipe
これを防ぐことができます。bash
monitor
答え2
$ grep -i gretting file
gretting: hello the world
gretting: good morning
gretting: good evening
$ readarray -d $'\n' -t temp < <(grep -i gretting file)
$ echo "${temp[0]}"
gretting: hello the world
$ echo "${temp[1]}"
gretting: good morning
$ echo "${temp[2]}"
gretting: good evening
または何らかの理由で中間スカラー変数を使用したい場合:
$ var=$(grep -i gretting file)
$ readarray -d $'\n' -t temp <<<"$var"
$ echo "${temp[0]}"
gretting: hello the world
$ echo "${temp[1]}"
gretting: good morning
$ echo "${temp[2]}"
gretting: good evening