我正在编写一个grep为$foo
的shell脚本,然后计算出现次数然后运行一个命令。每次运行该命令时,该文件中只有一个$ 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个实例。不确定最好的方法是什么。
答案 0 :(得分:4)
除非您有其他代码,但您没有向我们展示取决于$count
,否则您实际上并不需要计算出现次数;你只需要知道字符串是否出现在文件中。为此,你可以写:
while grep -q -- "$foo" /some/file ; do
some_command_that_deletes_foo_in_file
done
(使用以下事实:grep
在找到值时返回成功,在失败时返回失败,并使用-q
标志来抑制其控制台输出。
答案 1 :(得分: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
答案 2 :(得分:0)
您只想删除字符串“$ 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
优点是你只需要浏览一次文件(这可能是一个很长的操作)。但是,如果$foo
位于多行上,则您的计数可能不正确。
一些注意事项:
$(...)
优先于反叛count=
而不是$count=
。count= $(...)
错了,因为等号后面有空格。