Bash 为值读取文件,循环直到值=$foo?

Bash 为值读取文件,循环直到值=$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

我正在编写一个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
在运行时设置一次,并且不会更新。我想要的是
$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=$(…)
    错误,因为等号后面有空格

您只想删除字符串“$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=$(…)
    错误,因为等号后面有空格

count=$(grep-c$foo/some/file)count=$(grep-c$foo/some/file)
-q
还使其在返回匹配后停止读取文件,这比计数更有效。
-q
还使其在返回匹配后停止读取文件,这比计数更有效。OP的解释,“每次运行该命令时,该文件中就少了一个$foo实例”,这并不意味着