grep -E結果を破る方法

grep -E結果を破る方法

ファイルがあります。

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によって終了する可能性があります。-m3grepgrepreadln


¹オプションが有効になっていない限り(対話など)、shopt -s lastpipeこれを防ぐことができます。bashmonitor

おすすめ記事