7

私は次のファイルを持っていますlog.xml

<entry>
  <message>Line 1
  Line 2 and so on</message>
</entry>

CentOS5.4でxmlstarlet1.0.1を使用して次のコマンドを実行すると、次の行送りが削除されmessageます。

xml sel -t -m //entry -v "translate(message,'&#xa;' ,'@')" log.xml

結果は次のとおりです。

Line 1@  Line 2 and so on

xmlstarletを使用するCentOS6の場合:

1.3.1
compiled against libxml2 2.7.6, linked with 20706
compiled against libxslt 1.1.26, linked with 10126

私は受け取ります:

Line 1
  Line 2 nd so on

「and」は何にも変換されないことに注意してください。xmlstarletの問題ではなく、libxsltの変更だと思います。

それを修正する方法はありますか?

アップデート

文字「a」を0に変換する際の問題を追加しました。

4

3 に答える 3

6

改行の値を含む変数を定義することにより、一般的な方法でこれを解決できます。

--var linebreak -n --break 

次に、その変数をtranslate関数の2番目の引数として使用します。

xml sel -t -m //entry
        --var linebreak -n --break
        -v "translate(message, \$linebreak ,'@')"
        log.xml
于 2013-02-21T11:12:29.627 に答える
3

&#xa;XPath式自体がXMLファイル(XSLTスタイルシートなど)にある場合にのみ、改行文字を表します。ここで何が起こっているのかと思うと

translate(message,'&#xa;' ,'@')

コマンドラインでは、'&#xa;'は5文字の文字列として扱われているため、、、、のすべてを何も置き換えずに置き換えるようtranslateに指示して&います。@#xa;

ctrl-Vを使用してリテラル改行を試してください

xml sel -t -m //entry -v "translate(message,'<ctrl-V><CR>' ,'@')" log.xml

(つまり、コマンドを入力するときにctrl-Vを押してから、キャリッジリターンを押します。画面には次のように表示されます^M)。

于 2013-02-21T10:40:33.267 に答える
2

xmlstarletについてはわかりませんが、Xidelを試すことができます

xidel log.xml -e '//message/translate(., $line-ending, "@")'

パーサーからクエリエンジンまですべてを記述したので、依存関係はなく、すべてのシステムで同じように動作します。

于 2013-02-21T10:07:10.153 に答える