Bash 如何使用sed、awk或xmlet替换基于XML文件中元素名称的值

Bash 如何使用sed、awk或xmlet替换基于XML文件中元素名称的值,bash,awk,sed,xmlstarlet,Bash,Awk,Sed,Xmlstarlet,我试图将值10替换为值5,其中testname=“TG1” 更改此项: <stringProp name="ThreadGroup.num_threads">10</stringProp> 10 为此: <stringProp name="ThreadGroup.num_threads">5</stringProp> 5 片段示例 之前: <ThreadGroup guiclass="ThreadGroupGui" testclas

我试图将值10替换为值5,其中testname=“TG1”

更改此项:

<stringProp name="ThreadGroup.num_threads">10</stringProp>
10
为此:

 <stringProp name="ThreadGroup.num_threads">5</stringProp>
5
片段示例

之前:

<ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="TG1" enabled="true">
    <stringProp name="ThreadGroup.on_sample_error">continue</stringProp>
    </elementProp>
    <stringProp name="ThreadGroup.num_threads">10</stringProp>
  </ThreadGroup>
<ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="TG2" enabled="true">
    <stringProp name="ThreadGroup.on_sample_error">continue</stringProp>
    </elementProp>
    <stringProp name="ThreadGroup.num_threads">50</stringProp>
  </ThreadGroup>

持续
10
持续
50
之后:

<ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="TG1" enabled="true">
    <stringProp name="ThreadGroup.on_sample_error">continue</stringProp>
    </elementProp>
    <stringProp name="ThreadGroup.num_threads">5</stringProp>
  </ThreadGroup>
<ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="TG2" enabled="true">
    <stringProp name="ThreadGroup.on_sample_error">continue</stringProp>
    </elementProp>
    <stringProp name="ThreadGroup.num_threads">50</stringProp>
  </ThreadGroup>

持续
5.
持续
50
尝试此awk命令:

awk '$0 ~ "testclass=\"ThreadGroup\"" && $0 ~ "testname=\"TG1\""{replace=1}
     $0 ~ "testclass=\"ThreadGroup\"" && $0 !~ "testname=\"TG1\""{replace=0}
     replace{gsub("name=\"ThreadGroup.num_threads\">10</stringProp>",
                  "name=\"ThreadGroup.num_threads\">5</stringProp>",$0)}1' in.txt
awk'$0~“testclass=\'ThreadGroup\'&&&$0~”testname=\'TG1\'{replace=1}
$0~“testclass=\'ThreadGroup\'&&&$0!~testname=\“TG1\”“{replace=0}
替换{gsub(“name=\”ThreadGroup.num\u threads\”>10“,
.txt中的“name=\”ThreadGroup.num\u threads\>5“,$0)}1”

它将用
name=“ThreadGroup.num\u线程”>5替换所有
name=“ThreadGroup.num\u线程”>10个
,如果它们在
内,那么假设您实际拥有有效的XML,这确实是一个xpath问题:

xmlstarlet ed \
    --update '//ThreadGroup[@testname="TG1"]//stringProp[@name="ThreadGroup.num_threads"]' \
    --value 5 \
    file.xml
要将文件保存到位,请将
ed
更改为
ed--inplace

awk'{sub(/10/,“5”)}1'文件
awk '{sub(/10<\/stringProp>/,"5</stringProp>")}1' file

<ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="TG1" enabled="true">
    <stringProp name="ThreadGroup.on_sample_error">continue</stringProp>
    </elementProp>
    <stringProp name="ThreadGroup.num_threads">5</stringProp>
  </ThreadGroup>
<ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="TG2" enabled="true">
    <stringProp name="ThreadGroup.on_sample_error">continue</stringProp>
    </elementProp>
    <stringProp name="ThreadGroup.num_threads">50</stringProp>
  </ThreadGroup>
持续 5. 持续 50