在用其他文件

时间:2017-07-10 14:28:23

标签: bash shell sed scripting

我正在尝试从包含多个其他appender的logback.xml文件中替换appender,其中包含来自仅包含所需最终appender(appender.xml)的文件的配置。

使用Replace delimited block of text in file with the contents of another file提供的宝贵帮助,我设法替换了appender.xml文件中的logback.xml文字。

问题是:我似乎无法改变示例,也可以替换开始和结束要替换的模式的行。

我的logback.xml如下所示:

<appender name="Appender1" class="some.appender.class.stuff">
      <foo1>${VAR_1}</foo1>
      (...)
      <foo2>${VAR_2}</foo2>
</appender>

<appender name="THE_APPENDER_TO_BE_REPLACED" class="FOO.appender.FOO">
      <fooX>${VAR_Xfoo}</fooX>
      (...)
      <fooY>${VAR_Yfoo}</fooY>
</appender>

<appender name="Appender3" class="some.appender.class.stuff">
      <fooA>${VAR_A}</fooA>
      (...)
      <fooB>${VAR_B}</fooB>
</appender>

我的appender.xml看起来像:

<appender name="THE_REPLACEMENT_APPENDER" class="BAR.appender.BAR">
      <barX>${VAR_Xbar}</barX>
      (...)
      <barY>${VAR_Ybar}</barY>
</appender>

我想得到什么:

<appender name="Appender1" class="some.appender.class.stuff">
      <foo1>${VAR_1}</foo1>
      (...)
      <foo2>${VAR_2}</foo2>
</appender>

<appender name="THE_REPLACEMENT_APPENDER" class="BAR.appender.BAR">
      <barX>${VAR_Xbar}</barX>
      (...)
      <barY>${VAR_Ybar}</barY>
</appender>

<appender name="Appender3" class="some.appender.class.stuff">
      <fooA>${VAR_A}</fooA>
      (...)
      <fooB>${VAR_B}</fooB>
</appender>

我正在使用的是什么:

CURR_XML='/path/to/logback.xml'
BULK_START='<appender name="THE_APPENDER_TO_BE_REPLACED" class="FOO.appender.FOO">'
SUBS_FILE='/path/to/appender.xml'
BULK_END='<\/appender>'

cat ${CURR_XML} | sed -ne "/${BULK_START}/ {p; r ${SUBS_FILE}" -e ":a; n; /${BULK_END}/ {p; b}; ba}; p"

我得到了什么:

<appender name="Appender1" class="some.appender.class.stuff">
      <foo1>${VAR_1}</foo1>
      (...)
      <foo2>${VAR_2}</foo2>
</appender>

<appender name="THE_APPENDER_TO_BE_REPLACED" class="FOO.appender.FOO">
<appender name="THE_REPLACEMENT_APPENDER" class="BAR.appender.BAR">
      <barX>${VAR_Xbar}</barX>
      (...)
      <barY>${VAR_Ybar}</barY>
</appender>
</appender>

<appender name="Appender3" class="some.appender.class.stuff">
      <fooA>${VAR_A}</fooA>
      (...)
      <fooB>${VAR_B}</fooB>
</appender>

这是我正在使用的代码的预期输出。但我正试图摆脱那些加倍的<appender FOO stuff> </appender>旧线。

任何人都可以帮我替换批量的第一行和最后一行以及其余的appender吗?

1 个答案:

答案 0 :(得分:0)

尝试在每个p;/${BULK_START}/ {之后省略/${BULK_END}/ {。使用sed -n时,p命令会打印这些行。