回答:
簡単な方法の1つは、出力を変数に保存するのではなく、while / readループで直接反復することです。
何かのようなもの:
grep xyz abc.txt | while read -r line ; do
echo "Processing $line"
# your code goes here
done
あなたが何を求めているかに応じて、このスキームにはバリエーションがあります。
ループ内で変数を変更する必要がある場合(およびその変更がループの外で見えるようにする場合)、fedorquiの回答に記載されているように、プロセス置換を使用できます。
while read -r line ; do
echo "Processing $line"
# your code goes here
done < <(grep xyz abc.txt)
while read p || [[ -n $p ]]; do ...
(stackoverflow.com/questions/1521462/…から借用)
次のwhile read
ループを実行できます。grep
これは、いわゆるプロセス置換を使用してコマンドの結果によって供給されます。
while IFS= read -r result
do
#whatever with value $result
done < <(grep "xyz" abc.txt)
このようにして、結果を変数に格納する必要はありませんが、その出力をループに直接「注入」します。
使用を注意IFS=
してread -r
BashFAQ / 001の推奨事項に従って:私はファイル(データ・ストリーム、変数)をライン・バイ・ライン(および/またはフィールドごと)読むことができますどのように?:
読み取る-rオプションは、バックスラッシュの解釈を防止します(通常、バックスラッシュの改行ペアとして使用され、複数行にわたって継続するか、区切り文字をエスケープします)。このオプションがないと、入力のエスケープされていないバックスラッシュは破棄されます。ほとんどの場合、-rオプションをreadとともに使用する必要があります。
上記のシナリオでは、IFS =は先頭と末尾の空白のトリミングを防止します。この効果が必要な場合は削除してください。
プロセスの置換については、bashハッカーのページで説明されています。
プロセス置換は、プロセスの入力または出力(コマンドのシーケンス)が一時ファイルとして表示されるリダイレクトの形式です。
for
バージョンをストライキしました。stackoverflow.com/a/14588210/1983854の"${$(grep xyz abc.txt)[@]}"
ようにループを実行しようとしましたが、できませんでした。最初のバージョンはそのままにしておきます。
zsh
そのようなネストがおそらく機能するを使用している場合を除きます)。
while IFS= read -r result <&3
およびdone 3< <(grep ...
ここでは、grepの代わりにawkを使用することをお勧めします。
awk '$0~/xyz/{ //your code goes here}' abc.txt
//your code goes here
ますか?
grep -o
この種のものの力について言及していません。-o
フラグはお返ししますのみ出力の1行に1つの試合で、テキストと一致します。(網羅的ではないため、echo aaa |grep 'a*'
「aaa」のみを提供し、3つの部分一致「」、「a」、および「aa」を省略します)