6

次の種類のファイルがあるとします。

<?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>

私の使命は、 が最後に出現した直後にテキストを追加することです</section>

これら2つを見ると、利用tacする方が簡単なように見えますが、その方法もわかりません.sedを使用して、パターンの4番目の出現に文字列を追加しますhttp://www.unix.com/unix- dummies-questions-answers/46294-add-line-after-last-occurnace-pattern.html#post302149709

ありがとう。

4

7 に答える 7

6

これはうまくいくかもしれません(GNU sed):

sed '/\/section/{x;/./p;x;h;d};x;/./!{x;b};x;H;$!d;x;s/\/section[^\n]*\n/&  HELLO\n/' file

要するに、/section開始を含む行に遭遇すると、ホールド スペース (HS) 内のファイルの最後までのすべての残りの行を格納します。行が既にホールド スペースにあり、別のそのような行が検出された場合は、HS 内の行を印刷し、行の格納を再開します。ファイルの最後に目的の文字列を挿入し、保存されている行を出力します。

于 2013-02-12T06:55:01.453 に答える
2

一方通行 :

sed -i 's@</preferences>@  <section id="x">\n   <value id="path to widget data" xml:space="preserve">{Preferences}widgets/xxxx</value>\n  </section>\n&@' file.xml

<section>このスニペットは、ファイルに新しいものを追加しXMLます。

結果

<?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>
  <section id="x">
   <value id="path to widget data" xml:space="preserve">{Preferences}widgets/xxxx</value>
  </section>
</preferences>
于 2013-02-11T00:16:45.543 に答える
2

最後の section タグの後、つまり終了の "preferences" タグの前にテキストを挿入するには:

sed 's#</preferences>#  HELLO\n&#' file.xml

出力は次のようになります。

...
  </section>
  HELLO
</preferences>

-iその場で行うには、次のフラグを使用します。

sed -i 's#</preferences>#  HELLO\n&#' file.xml

パイプとして行うには:

cat file.xml | ...whatever... | sed 's#</preferences>#  HELLO\n&#'

sedXML は正規表現ベースでも行ベースでもないため、XML で正規表現を使用すると問題が発生する傾向があることに注意してください。より適切に行うには、perl、python、ruby、java などで実際の XML パーサーを使用してください。

于 2013-02-11T00:14:00.677 に答える
2

文字列が最初に出現する前に何かを追加する方が簡単です:

sed '/<\/preferences>/i\ADD SOME TEXT\nADD SOME MORE TEXT' file

結果:

<?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>

文字列の前に行を挿入する方法について詳しくは、こちらをご覧ください。HTH。

于 2013-02-11T00:22:59.953 に答える
1

上記の@Steveの回答はこれについての正しい方法ですが、OS X で失敗する原因となる癖が含まれています。複数行の挿入sedスクリプトをエンコードする適切で移植可能な方法は次のとおりです。

  1. 実際のコンテンツの前に改行を置き、
  2. 各改行 (コマンドの後の最初の改行を含む) をバックスラッシュでエスケープします。

最初の投稿のテキストを考慮して、更新された例を次に示します。

sed -i '' '/<\/preferences>/i\
ADD SOME TEXT\
ADD SOME MORE TEXT\
' test.xml

参考までに、OS Xsed(1)マンページからの抜粋、

     [2addr]H
             Append a newline character followed by the contents of the pattern space to the hold space.

     [1addr]i\
     text    Write text to the standard output.

     [2addr]l
             (The letter ell.)  Write the pattern space to the standard output in a visually unambiguous

…そしてGNUsed(1)マンページから:

       text   Append text, which has each embedded newline preceded by a back-
          slash.

       i \

       text   Insert text, which has each embedded newline preceded by a back-
          slash.

       q      Immediately  quit  the  sed  script  without processing any more
          input, except that if auto-print is  not  disabled  the  current
于 2015-01-07T16:48:21.260 に答える
1

awkを使用すると、このようにすることができます

awk '$0 ~ /<\/pref/{print "Hello\n"$0}' temp.txt

出力

Hello
</preferences>
于 2013-02-11T02:20:44.083 に答える