我有这个 shell 脚本来更新我的配置文件中的 IP 地址(任何匹配的$old_address_pattern
必须改为$new_address
):
grep -rl "$old_address_pattern" /etc \
| xargs sed -i "s/$old_address_pattern/$new_address/g"
If the grep
命令找不到匹配的文件,然后sed
会抱怨“没有输入文件”。当文件列表为空时,如何使该管道成功?
如果你想避免跑步sed
when grep
不产生任何输出,那么(因为你已经用 Ubuntu 标记了它),你可以给出-r
or --no-run-if-empty
论证xargs
:
--如果为空则不运行
-r
如果标准输入不包含任何非空白,则不要运行该命令。通常,即使没有输入,该命令也会运行一次。该选项是 GNU 扩展。
所以你的命令应该是这样的:
grep -rlZ "$old" /etc | xargs -0 -r sed -i "s/$old/$new/g"
(我添加了grep -Z
and xargs -0
标志,因为您的平台支持这些标志,并且它们使命令对恶意文件名更加稳健)
对于没有的平台xargs -r
,那么通常的解决方案是通过/dev/null
作为第一个文件名参数:
grep -rl "$old" /etc | xargs sed -i "s/$old/$new/g" /dev/null
在这种情况下,当没有匹配项时,sed
将在空设备上无害地运行。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)