问题
我如何将整行输出存储为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
你的问题是
for i in $(grep -E '##.*bash.*file.*add' bash.kb); do echo $i; done
迭代空格分隔的字在命令输出中。这有时被称为单词拆分或者更一般地拆分 + 统一。
你可以将行读入索引数组在 bash 中使用mapfile
(或其同义词readarray
)。因为mapfile
从标准输入读取,所以将命令替换替换$( ... )
为进程替换<( ... )
:
mapfile -t var < <(grep -E '##.*bash.*file.*add' bash.kb)
"${var[0]}"
您可以使用等检索值"${var[1]}"
(数组从零开始)或使用循环遍历它们
for i in "${var[@]}"; do echo "$i"; done
注意使用双引号来防止数组元素内的单词分割。
如果你实际上根本不需要变量,而只是想要循环遍历线命令输出,然后使用while
循环代替循环for
:
while read -r i; do
echo "$i"
done < <(grep -E '##.*bash.*file.*add' bash.kb)