我要从一个for循环的一个迭代中获取grep命令的输出,并在下一个迭代中将其转换为下一个grep命令的输入。
通常,我将使用数组和for循环来构建单个grep命令,但是由于我需要bash变量GREP_COLOR
来在两次迭代之间进行切换,因此我遇到了这个问题。我想我可以做三个不同的函数,除了那个变量外,它们都做同样的事情,但是我更愿意有一个函数。这是数组:
patterns=("general-red" "general-yellow" "general-green" "ha-red" "ha-yellow" "ha-green")
功能如下:
function iterate-patterns() {
for i in "${patterns[@]}"
do
if [[ "$i" = *-red ]]
then
GREP_COLOR="$RED" grep -E --text --color=always --line-buffered -f /var/lib/foobar/"${i}".txt
elif [[ "$i" = *-yellow ]]
then
GREP_COLOR="$YELLOW" grep -E --text --color=always --line-buffered -f /var/lib/foobar/"${i}".txt
elif [[ "$i" = *-green ]]
then
GREP_COLOR="$GREEN" grep -E --text --color=always --line-buffered -f /var/lib/foobar/"${i}".txt
else
cat
fi
done
}
这里是调用该函数的函数,提供初始输入:
function daddyfunction() {
iterate-filters |\
iterate-experimental |\
iterate-patterns
}
从本质上讲,数组中的每个项目都代表grep -f
命令的文件,其中包含许多要搜索的图案并以所需的颜色突出显示。但是,按照当前的代码显示,只有第一个数组项最终被显示。我可以肯定地说是因为每个grep需要以某种方式更改为以下迭代的grep命令的输入。
这可行吗?我会为每种颜色制作函数吗?有没有更好的方法来完成所有这些工作?我寻求互联网的智慧。 ;)请,谢谢。
仅需确认,三个独立的功能确实起作用:
function iterate-redhighlights() {
greplist=()
for i in "${redpatterns[@]}"
do
if [[ "$i" = *-red ]]
then
greplist+=( -f /var/lib/foobar/"${i}".txt)
else
cat
fi
done
GREP_COLOR="$RED" $search "${greplist[@]}"
}
function iterate-yellowhighlights() {
greplist=()
for i in "${yellowpatterns[@]}"
do
if [[ "$i" = *-yellow ]]
then
greplist+=( -f /var/lib/foobar/"${i}".txt)
else
cat
fi
done
GREP_COLOR="$YELLOW" $search "${greplist[@]}"
}
function iterate-greenhighlights() {
greplist=()
for i in "${greenpatterns[@]}"
do
if [[ "$i" = *-green ]]
then
greplist+=( -f /var/lib/foobar/"${i}".txt)
else
cat
fi
done
GREP_COLOR="$GREEN" $search "${greplist[@]}"
}
答案 0 :(得分:1)
从def self_post():
# try:
# post = reddit.subreddit(sub_reddit).submit(title=post_title, selftext=post_body)
# reddit.subreddit(sub_reddit).flair.set('bboe', '')
sub=reddit.subreddit(sub_reddit)
post = sub.submit(title=post_title, selftext=post_body, flair_id='bboe', flair_text='bahissiteleri flair')
读取grep
时,您无法循环运行。第一次迭代将读取stdin
的所有内容,并且无法退回到下一次迭代的开始(文件支持查找,但管道不支持查找,并且没有shell语法可以做到)。>
您可以在循环之前将所有stdin
复制到一个临时文件,然后每次处理该文件。将输出重定向到另一个临时文件,然后将其复制回输入文件以准备下一次迭代。
stdin