如果重复值,如何从段落中更改特定值

时间:2015-05-29 05:50:40

标签: linux ubuntu awk sed

使用SUSE计算机。

这是我文件中的一段

<object class="SaImmMngt">
                <dn>safRdn=immManagement,safApp=safImmService</dn>
                <attr>
                        <name>saImmRepositoryInit</name>
                        <value>2</value>
                </attr>
     </attr>
    </object>
    <object class="SaLogStreamConfig">
            <dn>safLgStrCfg=saLogAlarm,safApp=safLogService</dn>

其中&#34; safRdn = immManagement,safApp = safImmService&#34;是独特的。我必须将值2更改为1,但这些行在文件中除了唯一行之外的每个位置都会重复。我不想按行号更改它。

我正在尝试这个:

`sed -n '/safRdn=immManagement,safApp=safImmService/,/safLgStrCfg=saLogAlarm,safApp=safLogService/p' /etc/opensaf/imm.xml | sed -i '0,/1/s//2/' /etc/opensaf/imm.xml`

但是这个命令会在任何地方更改值,所以如何捕获该特定字符串并更改文件。

注意:字符串 &#34; safRdn = immManagement,safApp = safImmService&#34;文件中是唯一的字符串,而文件中的其他行都是重复的。我不想创建任何额外的文件,更改应该只在文件中。

2 个答案:

答案 0 :(得分:0)

这会将值从2更改为1,但前提是它在您的唯一字符串之后的三行内:

pointer operator-> const(){ return cur; }

要更改文件,请使用$ sed '/safRdn=immManagement,safApp=safImmService/,+3 s/<value>2/<value>1/' file <object class="SaImmMngt"> <dn>safRdn=immManagement,safApp=safImmService</dn> <attr> <name>saImmRepositoryInit</name> <value>1</value> </attr> </attr> </object> <object class="SaLogStreamConfig"> <dn>safLgStrCfg=saLogAlarm,safApp=safLogService</dn> 选项。

-i

如何运作

  • sed -i '/safRdn=immManagement,safApp=safImmService/,+3 s/<value>2/<value>1/' file

    这将设置一个以包含您的唯一字符串的行开头的范围,并继续执行后面的前三行。

    如果一般情况下,三行不够,可以根据需要增加数量。

  • /safRdn=immManagement,safApp=safImmService/,+3

    此命令仅适用于范围内的行。对于范围内的任何行,字符串s/<value>2/<value>1/将更改为<value>2

答案 1 :(得分:0)

sed '/<object class="SaImmMngt">/,\#</object># {
   \#<dn>safRdn=immManagement,safApp=safImmService</dn>#,\#</object># { 
      \#<name>saImmRepositoryInit</name>#,\#</attr># {
         \#<value># s/2/1/
         }
      }
   }' YourFile
  • 使用子选择更改您选择的子树中的值,仅更改符合条件的部分。
  • 对于特定的已知文件,这可能会更短,这里是通用的(可重用于其他条件)
  • 使用模式分隔符(主要是#),它不能成为模式的一部分(如默认/,除非你逃避它)