sed命令从某些搜索位置替换文本

时间:2018-09-18 11:32:00

标签: sed

我想用水果葡萄的5000代替2000。如何使用sed从“葡萄”位置开始搜索并替换首次出现的

<fruits>
   <fruit>
        <name>apple</name>
        <value>2000</value>
   </fruit>
   <fruit>
        <name>grapes</name>
        <value>2000</value>
   </fruit>
   <fruit>
        <name>banana</name>
        <value>2000</value>
   </fruit>
</fruits>

我尝试了

  

sed '\,grapes, s/2000/5000/' fruits.txt

3 个答案:

答案 0 :(得分:0)

app.php

我们使用广义的use来避免在结束标记中反斜杠。 FormServiceProvider.php不需要反斜杠,因为if (pictureBox1.Image == Properties.Resources.bug1) { MessageBox.Show("here"); } 已经知道sed -i '\%<name>grapes</name>%,\%</fruit>%s%<value>2000</value>%<value>5000</value>%' fruits.xml 之后的东西是分隔符。

在* BSDish平台(包括MacOS)上,您需要在脚本本身之前添加\%的显式空字符串参数(因此s%%%

这是严格的,但是当然不能解决XML语法上允许的所有可能的变体。如果您的文件始终采用预期的格式,则此方法现在应该可以使用。缺点之一是,由于Jenkins决定开始在标签内或其他标签内使用空格,因此当它停止工作时您不会收到任何警告。

答案 1 :(得分:0)

使用xmlstarlet:

xmlstarlet ed -u "//fruits/fruit/name[.='grapes']/following-sibling::value" -v 5000 fruits.xml

这将通过选择xpath ed -u(其中//fruits/fruit/namenamegrapesfollowing-sibling的xpath value来更新(5000)xml。 ,将内容更改为perform()

答案 2 :(得分:0)

sed用于做旧的/旧的/新的全部。对于其他任何事情,您都应该使用awk:

$ awk '/grapes/{f=1} f && sub(/2000/,"5000"){f=0} 1' file
<fruits>
   <fruit>
        <name>apple</name>
        <value>2000</value>
   </fruit>
   <fruit>
        <name>grapes</name>
        <value>5000</value>
   </fruit>
   <fruit>
        <name>banana</name>
        <value>2000</value>
   </fruit>
</fruits>