Bash将号码更改为特定行

时间:2017-11-15 14:44:45

标签: bash sed scripting

我是bash脚本的新手,我正在寻找解决方案,将数字更改为特定行上的另一个值。 我有一个名为 foo.config 的文件,在这个文件中我有大约100行配置。 例如我有

<UpdateInterval>2</UpdateInterval>

我需要在 foo.config 上找到这一行,并且一如既往地将数字(这可以是0到10的数字,我的例子是2)替换为0。

像这样: <UpdateInterval>0</UpdateInterval>

我怎么能用sed做到这一点?请建议

部分行:

<InstallUrl />
<TargetCulture>en</TargetCulture>
<ApplicationVersion>1.0.1.8</ApplicationVersion>
<AutoIncrementApplicationRevision>true</AutoIncrementApplicationRevision>
<UpdateEnabled>true</UpdateEnabled>
<UpdateInterval>2</UpdateInterval>
<UpdateIntervalUnits>hours</UpdateIntervalUnits>
<ProductName>xxxxxxxxxxxx</ProductName>
<PublisherName />
<SupportUrl />
<FriendlyName>xxxxxxxxxxxx</FriendlyName>
<OfficeApplicationDescription />
<LoadBehavior>3</LoadBehavior>

  

3 个答案:

答案 0 :(得分:1)

以一种非常简单的方式,您可以尝试:

sed -E 's/^<UpdateInterval>[0-9]+/<UpdateInterval>0/' foo.config

这将在一行的开头搜索<UpdateInterval>(注意^),然后一个数字([0-9]代表一个数字,+代表重复一个或多个)。该位将替换为<UpdateInterval>0/个字符将您搜索的内容与将替换它的内容分开。 s命令是搜索和替换。

将文件foo.config作为输入,您将获得标准输出的输出。如果您希望输出在同一个文件上,您可以这样做:

sed -E 's/^<UpdateInterval>[0-9]+/<UpdateInterval>0/' foo.config >foo.temp
mv foo.temp foo.config

或更简单:

sed -i -E 's/^<UpdateInterval>[0-9]+/<UpdateInterval>0/' foo.config

请注意,如果配置文件包含常规 XML,则这不是替换的好方法。它只能在最简单的情况下工作(但是可以用于您的示例。)如果您的XML位可能位于一行中间,请删除^字符。搜索和替换表达式假定XML标记周围没有空格。

答案 1 :(得分:1)

sed 和其他人( grep awk )永远不是解析xml / html数据的好工具。使用适当的xml / html解析器,例如 xmlstarlet

xmlstarlet ed -L -O -u "//UpdateInterval" -v 0 foo.config
  • ed - 编辑模式

  • -L - 编辑文件 inplace

  • -O - 省略xml声明
  • -u - 更新操作
  • "//UpdateInterval" - xpath表达式
  • -v 0 - 要更新的元素的新值

最终(示例性)foo.config内容:

<root>
  <InstallUrl/>
  <TargetCulture>en</TargetCulture>
  <ApplicationVersion>1.0.1.8</ApplicationVersion>
  <AutoIncrementApplicationRevision>true</AutoIncrementApplicationRevision>
  <UpdateEnabled>true</UpdateEnabled>
  <UpdateInterval>0</UpdateInterval>
  <UpdateIntervalUnits>hours</UpdateIntervalUnits>
  <ProductName>xxxxxxxxxxxx</ProductName>
  <PublisherName/>
  <SupportUrl/>
  <FriendlyName>xxxxxxxxxxxx</FriendlyName>
  <OfficeApplicationDescription/>
  <LoadBehavior>3</LoadBehavior>
</root>

为了演示目的指定了<root>标记,您的xml / html结构应该有自己的“root”(大多数父标记)

答案 2 :(得分:0)

使用XML解析工具的解决方案:

    SimpleDateFormat sdf = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss 'GMT'Z", Locale.ENGLISH);
    String dateParam = sdf.format(date);
    MvcResult result = mockMvc.perform(get("/usages")
            .param("date", dateParam))
            .andExpect(status().isOk()).andReturn();

第一行是将配置文件转换为正确的XML文件 第二行更新值 第三行删除根标签 最后一行重写配置文件。需要安装{ echo '<root>'; cat foo.config; echo '</root>'; } | xmlstarlet ed -O -P -u //UpdateInterval -v 0 | sed '1d;$d' | sponge foo.config 包。