Sed:在最后一次出现后追加

Det*_*Det 4 sed

假设我有以下类型的文件:

<?xml version="1.0" encoding="utf-8"?>
<preferences>
  <section id="widgets">
    <value id="version" xml:space="preserve">1</value>
  </section>
  <section id="wuid-b2a8e6b8-6619-714e-9cfe-466c27c90902">
    <value id="path to widget data" xml:space="preserve">{Preferences}widgets/opera-adblock-1.3.4-1.oex</value>
  </section>
  <section id="wuid-0c5cfdb2-8e51-f149-a1e7-51d66240ed7a">
    <value id="path to widget data" xml:space="preserve">{Preferences}widgets/flag-button-1.5.4-1.oex</value>
  </section>
</preferences>
Run Code Online (Sandbox Code Playgroud)

我的任务是在最后一次出现之后立即添加文本</section>.

看看这两个看起来好像利用tac会更简单,但我不明白怎么做:使用sed将字符串附加到第四次出现的模式,http://www.unix.com/unix-假人疑问的答案/ 46294-附加线后最后occurnace-pattern.html#post302149709

谢谢.

pot*_*ong 5

这可能适合你(GNU sed):

sed '/\/section/{x;/./p;x;h;d};x;/./!{x;b};x;H;$!d;x;s/\/section[^\n]*\n/&  HELLO\n/' file
Run Code Online (Sandbox Code Playgroud)

本质上:遇到一行包含/section开始将所有剩余行存储到保留空间(HS)中文件的末尾.如果线已经在保持空间中并且遇到另一条这样的线,则打印HS中的线并再次开始存储线.在文件的末尾插入所需的字符串并打印出存储的行.

  • 谢谢.其他人都在解决OP的问题,这对他们和网站的大部分内容当然非常有用.你是唯一一个回答问题的人(你仍然发布了一个有助于OP的解决方案),这有助于像我这样来自Google的人有类似的问题. (3认同)

Ste*_*eve 3

在字符串第一次出现之前添加内容会更容易:

sed '/<\/preferences>/i\ADD SOME TEXT\nADD SOME MORE TEXT' file
Run Code Online (Sandbox Code Playgroud)

结果:

<?xml version="1.0" encoding="utf-8"?>
<preferences>
  <section id="widgets">
    <value id="version" xml:space="preserve">1</value>
  </section>
  <section id="wuid-b2a8e6b8-6619-714e-9cfe-466c27c90902">
    <value id="path to widget data" xml:space="preserve">{Preferences}widgets/opera-adblock-1.3.4-1.oex</value>
  </section>
  <section id="wuid-0c5cfdb2-8e51-f149-a1e7-51d66240ed7a">
    <value id="path to widget data" xml:space="preserve">{Preferences}widgets/flag-button-1.5.4-1.oex</value>
  </section>
    ADD SOME TEXT
    ADD SOME MORE TEXT
</preferences>
Run Code Online (Sandbox Code Playgroud)

您可以在此处阅读有关如何在字符串前插入行的更多信息。HTH。