問題
すべての文字列ではなく、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'
どうやってやるの?
ありがとう。
あなたの問題はそれです
_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)
_