【问题标题】:DON'T Keep 'Begin' and 'End' while replacing block of text with contents of another file在用另一个文件的内容替换文本块时不要保留“开始”和“结束”
【发布时间】:2017-12-14 08:18:51
【问题描述】:

我正在尝试将包含其他几个附加程序的 logback.xml 文件中的附加程序替换为仅包含所需最终附加程序 (appender.xml) 的文件中的配置。

Replace delimited block of text in file with the contents of another file 的宝贵帮助下,我设法替换了logback.xml 文件中的appender.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>

这是我正在使用的代码的预期输出。但我正试图摆脱 &lt;appender FOO stuff&gt; &lt;/appender&gt; 旧行,它们会翻倍。

谁能帮我把第一行和最后一行连同附加程序的其余部分一起替换掉?

【问题讨论】:

    标签: bash shell sed scripting


    【解决方案1】:

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

    【讨论】:

    • 谢谢!它一直工作得很好。我试图在 'BEGIN' 之前和 'END' 之后得到这条线,因为我把那些 p;s 误认为是 'print from' 和 'print until' 标记。
    猜你喜欢
    • 2011-02-11
    • 2017-05-25
    • 1970-01-01
    • 1970-01-01
    • 2020-02-29
    • 2015-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多