Bash 为值读取文件,循环直到值=$foo?
我正在编写一个shell脚本,它greps forBash 为值读取文件,循环直到值=$foo?,bash,loops,Bash,Loops,我正在编写一个shell脚本,它greps for$foo然后计算出现的次数,然后运行一个命令。每次运行该命令时,该文件中就少了一个$foo实例。不确定如何连续读取该文件并减少我设置的变量中的值 $count= `grep -o $foo /some/file |wc -w` until [ $count -eq 0 ] do some_command_that_deletes_foo_in_file done 然而,我意识到,$count在运行时设置一次,并且不会更新。我想要的是$c
$foo
然后计算出现的次数,然后运行一个命令。每次运行该命令时,该文件中就少了一个$foo实例。不确定如何连续读取该文件并减少我设置的变量中的值
$count= `grep -o $foo /some/file |wc -w`
until [ $count -eq 0 ]
do
some_command_that_deletes_foo_in_file
done
然而,我意识到,
$count
在运行时设置一次,并且不会更新。我想要的是$count
更新为/some/file
中的当前计数,同时脚本在/some/file中循环,直到有0个我正在搜索的短语实例。不确定最佳方法是什么 您可以在循环中添加grep命令:
count=$(grep -o "$foo" /some/file |wc -w)
until (( count == 0 ))
do
some_command_that_deletes_foo_in_file
count=$(grep -o "$foo" /some/file |wc -w)
done
您可以在循环中添加grep命令:
count=$(grep -o "$foo" /some/file |wc -w)
until (( count == 0 ))
do
some_command_that_deletes_foo_in_file
count=$(grep -o "$foo" /some/file |wc -w)
done
除非您有其他依赖于
$count
的代码没有显示给我们,否则您实际上不需要计算出现次数;您只需要知道该字符串是否出现在文件中。为此,您可以写:
while grep -q -- "$foo" /some/file ; do
some_command_that_deletes_foo_in_file
done
(使用
grep
在找到值时返回成功,在未找到值时返回失败的事实,并使用-q
标志来抑制其控制台输出)。除非您有其他依赖于$count
的代码没有显示给我们,否则您实际上不需要计算出现次数;您只需要知道该字符串是否出现在文件中。为此,您可以写:
while grep -q -- "$foo" /some/file ; do
some_command_that_deletes_foo_in_file
done
(使用
grep
在找到值时返回成功,在没有找到值时返回失败的事实,并使用-q
标志抑制其控制台输出)。您只想删除字符串“$foo”?使用sed:
sed "/$foo/d" /some/file > /some/other/file
sed命令是一个编辑器。/$foo/
正在获取一个正则表达式(无论$foo
的值是什么),并在文件中找到它。d
命令它删除该行
sed
通常不进行就地编辑。通常必须先写入另一个文件,然后再写入移动。但是,某些sed
命令可能有这样的参数。您可以检查您的管理
第二次尝试 我认为它必须采取一些行动或执行一些处理或其他什么,其影响之一是$foos中的一个消失了。(但我可能错了。)-鲁克昨天 这就是我在晚上回答这些问题的原因 如果
grep
可以找到正则表达式,则可以利用它返回true(即退出值=0),否则返回false(即退出值不等于0):
while grep -o -q "$foo" "/some/file"
do
some_command_that_deletes_foo_in_file
done
-q
告诉grep不要输出任何东西。相反,如果找到字符串,grep
的退出值将为true,如果未找到,则为false
阅读grep
上的手册页。一些grep
命令没有-q
参数。在这种情况下,您需要将STDOUT和STDERR重定向到/dev/null
另一种方法可能是计算行数,然后将其用作计数器:
count=$(grep -o "$foo" "/some/file" | wc -w) # $(...) is the preferred syntax over `...`
for loop in {1..$count}
do
some_command_that_deletes_foo_in_file
done
优点是您只需grep浏览一次文件(这可能是一个很长的操作)。但是,如果$foo
在多行上,您的计数可能不正确
请注意:
优先于反勾号$(…)
- 设置变量时,在该变量前面不使用美元符号。注意我有
而不是count=
$count=
- 观察空间
错误,因为等号后面有空格count=$(…)
sed "/$foo/d" /some/file > /some/other/file
sed命令是一个编辑器。/$foo/
正在获取一个正则表达式(无论$foo
的值是什么),并在文件中找到它。d
命令它删除该行
sed
通常不进行就地编辑。通常必须先写入另一个文件,然后再写入移动。但是,某些sed
命令可能有这样的参数。您可以检查您的管理
第二次尝试 我认为它必须采取一些行动或执行一些处理或其他什么,其影响之一是$foos中的一个消失了。(但我可能错了。)-鲁克昨天 这就是我在晚上回答这些问题的原因 如果
grep
可以找到正则表达式,则可以利用它返回true(即退出值=0),否则返回false(即退出值不等于0):
while grep -o -q "$foo" "/some/file"
do
some_command_that_deletes_foo_in_file
done
-q
告诉grep不要输出任何东西。相反,如果找到字符串,grep
的退出值将为true,如果未找到,则为false
阅读grep
上的手册页。一些grep
命令没有-q
参数。在这种情况下,您需要将STDOUT和STDERR重定向到/dev/null
另一种方法可能是计算行数,然后将其用作计数器:
count=$(grep -o "$foo" "/some/file" | wc -w) # $(...) is the preferred syntax over `...`
for loop in {1..$count}
do
some_command_that_deletes_foo_in_file
done
优点是您只需grep浏览一次文件(这可能是一个很长的操作)。但是,如果$foo
在多行上,您的计数可能不正确
请注意:
优先于反勾号$(…)
- 设置变量时,在该变量前面不使用美元符号。注意我有
而不是count=
$count=
- 观察空间
错误,因为等号后面有空格count=$(…)
-q
还使其在返回匹配后停止读取文件,这比计数更有效。-q
还使其在返回匹配后停止读取文件,这比计数更有效。OP的解释,“每次运行该命令时,该文件中就少了一个$foo实例”,这并不意味着