检查sed命令是否进行了更改

时间:2016-04-17 06:35:15

标签: bash sed

我正在为Ubuntu编写现在的bash脚本。 我有很多sed语句来替换和更改文件中的一些文本。

我的问题是:我怎么知道改变是否已经完成。

例如,我有这样的陈述:

sed -i "s;#net.ipv4.ip_forward=1;net.ipv4.ip_forward=1;" /etc/sysctl.conf

是否真的对文件进行了更改?

3 个答案:

答案 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,则可以明确检查$?并尖叫。

另请注意,正则表达式比示例中更严格。如果您真的希望在其中任何地方与其他文本进行更改,那么您也需要适应。