web-dev-qa-db-ja.com

変数としてのbash、grep、行全体

問題

すべての文字列ではなく、grepからの行全体の出力を1つの変数として保存するにはどうすればよいですか。

例(必要な変数は3つ、行全体)。

user@local:~/bin/kb$ grep -E '##.*bash.*file.*add' bash.kb
## bash, file, add string behind founded string
## bash, files, add string to begin
## bash, file, add comma to end of line except last line
user@local:~/bin/kb$

しかし、forの例。

user@local:~/bin/kb$ for i in $(grep -E '##.*bash.*file.*add' bash.kb); do echo $i; done
##
bash,
file,
add
string
behind
founded
string
##
bash,
files,
add
string
to
begin
##
bash,
file,
add
comma
to
end
of
line
except
last
line
user@local:~/bin/kb$ 

これが必要です(行全体で3つの変数のみ)。

1st variable $i[0] = '## bash, file, add string behind founded string'
2nd variable $i[1] = '## bash, files, add string to begin'
3rd variable $i[2] = '## bash, file, add comma to end of line except last line'

どうやってやるの?

ありがとう。

1
genderbee

あなたの問題はそれです

_for i in $(grep -E '##.*bash.*file.*add' bash.kb); do echo $i; done
_

コマンド出力の空白区切りwordsを反復します。これはWord splittingと呼ばれることもあり、より一般的にはsplit + globと呼ばれることもあります。

mapfile(またはその同義語readarray)を使用して、bashでインデックス付き配列に行を読み取ることができます。 mapfileは標準入力から読み取るため、コマンド置換$( ... )をプロセス置換<( ... )で置き換えます。

_mapfile -t var < <(grep -E '##.*bash.*file.*add' bash.kb)
_

_"${var[0]}"_、_"${var[1]}"_など(配列はゼロベース)を使用して値を取得するか、またはすべてを使用してそれらをループできます。

_for i in "${var[@]}"; do echo "$i"; done
_

配列要素内での単語分割を防ぐために、二重引用符を使用していることに注意してください。


実際に変数が必要なく、単にコマンド出力のlinesをループしたい場合は、whileの代わりにforループを使用しますループ:

_while read -r i; do
  echo "$i"
done < <(grep -E '##.*bash.*file.*add' bash.kb)
_
1
steeldriver