【问题标题】:Replacing a value in xml file using awk or sed使用 awk 或 sed 替换 xml 文件中的值
【发布时间】:2020-01-17 16:43:36
【问题描述】:

我想将"ThreadGroup.num_threads"(即2000)的值替换为另一个值,即500。我的文件名是“test.xml”

这是我想用500 替换2000 值的xml 文件:

<ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="JWT-API Thread Group" enabled="true">
    <stringProp name="ThreadGroup.on_sample_error">continue</stringProp>
    <elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="Loop Controller" enabled="true">
    <boolProp name="LoopController.continue_forever">false</boolProp>
    <stringProp name="LoopController.loops">1</stringProp> </elementProp>
    <stringProp name="ThreadGroup.num_threads">2000</stringProp>
    <stringProp name="ThreadGroup.ramp_time">1</stringProp>
    <boolProp name="ThreadGroup.scheduler">false</boolProp>
    <stringProp name="ThreadGroup.duration"></stringProp>
    <stringProp name="ThreadGroup.delay"></stringProp>
</ThreadGroup>

我制作了一个有助于替换值的脚本,但不知何故,我对值进行了硬编码,并对路径位置进行了硬编码。我需要一种方法,以便它识别位置本身,就像我在 awk 命令中定义的那样,并使用定义的参数替换值 $Ratio

#!/bin/bash
Ratio="500"
for file in Sample.jmx; do
        awk -F"[<>]" '/ThreadGroup.num_threads/{print $3}' $file > output.json
        sed -i 's:<stringProp name="ThreadGroup.num_threads">2000</stringProp>:<stringProp name="ThreadGroup.num_threads">500</stringProp>:' $file
done
Output=$((`cat < output.json`))
echo $Output
#UpScale = number_of_threads / 1000
UpScale=$((`cat < output.json` / $Ratio))
echo $UpScale

【问题讨论】:

  • Don't Parse XML/HTML With Regex. 我建议使用 XML/HTML 解析器 (xmlstarlet, xmllint ...)。
  • 所以将&lt;stringProp name="ThreadGroup.num_threads"&gt;2000&lt;/stringProp&gt; 替换为&lt;stringProp name="ThreadGroup.num_threads"&gt;500&lt;/stringProp&gt;。有什么困难?
  • 有什么问题吗?你的代码在哪里?这不是代码编写服务。如果你表明你已经做了一些尝试,人们会愿意提供帮助。
  • 我已经编辑了帖子并完成了我的工作,但不知何故我想摆脱我工作的所有硬编码的东西
  • 你可以使用's:..text...'$Ratio'...text..:'创建字符串

标签: python bash shell unix sh


【解决方案1】:

你可以在字符串之间放置变量

's:..text...'$Ratio'...text..:'

它会将所有内容连接到一个字符串中-但字符串和$Ratio之间不能有空格

sed -i 's:<stringProp name="ThreadGroup.num_threads">2000</stringProp>:<stringProp name="ThreadGroup.num_threads">'$Ratio'</stringProp>:' $file

如果没有其他 num_threads 那么你可以使用更短的字符串

sed -i 's:num_threads">2000<:num_threads">'$Ratio'<:' $file

使用()(或在某些系统上使用\( \)),您可以捕获输入字符串中的文本并在输出字符串中使用$1$2

sed -i 's:(num_threads">)2000(<):$1'$Ratio'$2:' $file

这样你可以为更长的版本创建更短的字符串

sed -i 's:(<stringProp name="ThreadGroup.num_threads">)2000(</stringProp>):$1'$Ratio'$2:' $file

在 Linux Mint 上,我必须使用 \( \) 而不是 ()

sed -i 's:\(num_threads">\)2000\(<\):$1'$Ratio'$2:' $file

或者我必须添加选项-E--regexp-extended

sed -i -E 's:(num_threads">)2000(<):$1'$Ratio'$2:' $file

【讨论】:

  • 天才!!非常感谢!
猜你喜欢
  • 2014-02-05
  • 2021-01-30
  • 1970-01-01
  • 1970-01-01
  • 2014-09-08
  • 2017-09-06
  • 1970-01-01
  • 1970-01-01
  • 2021-09-14
相关资源
最近更新 更多