我是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>
答案 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
包。