我正在为Ubuntu编写现在的bash脚本。
我有很多sed
语句来替换和更改文件中的一些文本。
我的问题是:我怎么知道改变是否已经完成。
例如,我有这样的陈述:
sed -i "s;#net.ipv4.ip_forward=1;net.ipv4.ip_forward=1;" /etc/sysctl.conf
是否真的对文件进行了更改?
答案 0 :(得分:0)
您可以使用cmp
来比较文件的旧版本和新版本。事实上,这可能是确定sed
是否做某事的最可靠方法。
请注意,您不能依赖sed退出状态来确定它是否进行了任何更改。所有存在状态将告诉您sed
是否“成功”。
即使它确实......在GNU sed的man或info页面中没有记录退出状态。该行为是“实施细节”,可能会发生变化。
答案 1 :(得分:0)
您可以使用$?
shell变量检查命令的结果。
如果未找到匹配项,您还可以更改sed命令的返回状态。相关链接:Return code of sed for no match
答案 2 :(得分:0)
使用GNU Awk,
if gawk --inplace '/^#net\.ipv4\.ip_forward=1$/ { sub("#",""); s=1 }
1
END { exit 1-s }' /etc/sysctl.conf
then
echo "Success"
else
echo "No change"
fi
这无法正确区分无更改和系统错误(权限被拒绝,文件未找到等)。您可能想在运行Awk之前检查这些条件;或者如果故障分支中没有1,则可以明确检查$?
并尖叫。
另请注意,正则表达式比示例中更严格。如果您真的希望在其中任何地方与其他文本进行更改,那么您也需要适应。