2017-09-16 11 views
1

これは非常に面倒ですが、はるかに単純な作業です。このguideによると、私はこれを書いた:XMLStarlet経由でアンパサンド(&)をエスケープする - バグ&

#!/bin/bash 

content=$(wget "https://example.com/" -O -) 
ampersand=$(echo '\&') 

xmllint --html --xpath '//*[@id="table"]/tbody' - <<<"$content" 2>/dev/null | 
    xmlstarlet sel -t \ 
     -m "/tbody/tr/td" \ 
      -o "https://example.com" \ 
      -v "a//@href" \ 
      -o "/?A=1" \ 
      -o "$ampersand" \ 
      -o "B=2" -n \ 

私は最後にこれを受け取る & として、私は成功したテーブルから各リンクを抽出し、すべてが正しく連結されます、しかし、代わりのアンパサンドを再現します各リンク:

https://example.com/hello-world/?A=1&B=2 

https://example.com/hello-world/?A=1\&amp;B=2 

しかし実際には、私のようなものを探していました

アイデアは、バックスラッシュ\&を使用して文字をエスケープして無視されるようにすることです。最初は、-o "$ampersand" \の代わりに-o "\&" \に直接置き、この場合のシナリオではampersand=$(echo '\&')を削除しました。それでも同じ結果。

は本質的には、バックスラッシュを除去することによって、それはまだ出力:

https://example.com/hello-world/?A=1&amp;B=2 

のみ&amp;背後\が削除されていること。

なぜですか?

私はそれが欠けている何か基本的なものだと確信しています。

+0

である、あなたは、所望の出力と一緒にいくつかのサンプル入力を含める必要がありますので、我々は可能な解決策をテストすることができます。 –

+0

あなたは正しいです。私はあなたの助言に従います!乾杯@ TomFenech –

答えて

1

申し訳ありませんあなたの結果は再現できませんが、置き換えを行わないのはなぜですか?結果をフィルタリングするだけで

sed 's/\\&amp;/\&/g' 

パイプに追加してください。それはすべて& amp; 〜&。

+0

こんにちは@vollitwr私は最後に '**'を取り除くべきだと思います。そうでなければ、この 'sed 's/\\ &/\&/ g''を配管するのが一番うまくいくと思います。 –

+0

申し訳ありませんが、修正されました。それはStackoverflowフォーマットのままでした。 – vollitwr

1

すでに見てきたように、バックスラッシュエスケープは解決策ではありません。

そしてちょうどスタートを追加するために、このようなsedとして標準的なテキスト処理ツールを使用して、(おそらくこれを行うには両方xmllintxmlstarletを使用する必要はありません)のhrefを抽出します。私は2つの可能な選択肢を考えることができますそして最後:また

sed 's,^,https://example.com/,; s,$,/?A=1\&B=2,' 

、パイプ&&amp;を変更しますあなたが現在xmlstarlet unescに持っているものの出力、。

+0

こんにちは@TomFenechパイピング 'xmlstarlet unesc'は私のために働いた。ありがとう! –

1

&amp;は、XML文書で&を印刷する正しい方法ですが、単純なURLを必要とするだけで、出力はXMLであってはいけません。したがって、--textまたは-Tselコマンドに渡すことで、テキストモードに切り替える必要があります。

example.comにはtableという要素がありませんが、ここではp要素のリンクを構築する作業例があります。

content=$(wget 'https://example.com/' -O -) 
xmlstarlet fo --html <<<"$content" | 
    xmlstarlet sel -T -t \ 
     -m '//p[a]' \ 
      --if 'not(starts-with(a//@href,"http"))' \ 
       -o 'https://example.com/' \ 
      --break \ 
      -v 'a//@href' \ 
      -o '/?A=1' \ 
      -o '&' \ 
      -o 'B=2' -n 

出力は、あなたの答えの品質を向上させるために

http://www.iana.org/domains/example/?A=1&B=2 
+0

こんにちは@npostavs、それは本当によく私のスクリプトを簡素化します。私の場合の '--if'は、抽出されるすべてのリンクにベースURLがないため、冗長です。 Elsewise、それは素晴らしい作品です。乾杯! –

関連する問題