改行は xml データに正当に表示されます。より堅牢なアプローチでは、XML データに出現しないことが保証されている文字で xpath の結果を区切ります。Universal Coded Character SetのNull 文字U+0000 は、このような文字です。
null 制御文字に割り当てられたコード ポイント U+0000 は、XML 1.0 および 1.1 ドキュメントで常に無効な Unicode および ISO/IEC 10646 でエンコードされた唯一の文字であることに注意してください。
– https://en.wikipedia.org/wiki/Valid_characters_in_XML
@Cyker のマージ要求には、 xpath の結果を NUL で区切るオプションxmllint
の追加が含まれていました。この機能の新機能リクエストも公開されました。-xpath0
うまくいけば、xmllint
この機能はすぐに得られます。
もう 1 つの xpath コマンド ライン ツールでxmlstarlet
ある を利用して、この目標を達成することができます。xmlstarlet
は現在、NUL の出力を直接サポートしていませんが、U+FFFF
NUL と同様に、XML データでは発生しないことが保証されている output にすることができます。( Universal Coded Character Setの UTF-8 エンコーディングを想定しています。)次に、変換U+FFFF
する必要があるだけU+0000
で、NUL で区切られた xpath の結果が得られます。
次の例では、次の部分的な html ファイルを使用します。テスト目的で改行を追加したことを除いて、質問と同じデータです。
cat > data.html <<'EOF'
<textarea name="command" class="setting-input fixed-width" rows="9">1
newline</textarea>
<textarea name="command" class="setting-input fixed-width" rows="5">2
newline</textarea>
EOF
以下は、xpath の結果を NUL で区切るワンライナーの使用方法xmlstarlet
ですperl
。
xmlstarlet fo -H -R data.html \
| xmlstarlet sel -t -m '//textarea[@name="command"]' -v '.' -o $'\uffff' \
| perl -C -0xFFFF -l0 -pe ''
注: xmlstarlet fo -H -R
@TheDudeAbides の回答に示すように、HTML を実行しました。
xpath の結果が NUL で区切られたので、 を使用して結果を処理できますxargs -0
。例:
xmlstarlet fo -H -R data.html \
| xmlstarlet sel -t -m '//textarea[@name="command"]' -v '.' -o $'\uffff' \
| perl -C -0xFFFF -l0 -pe '' \
| xargs -0 -n 1 printf '%q\n'
結果:
'1 '$'\n'' newline'
'2 '$'\n'' newline'
または bash 配列にロードします。
mapfile -t -d '' a < <(
xmlstarlet fo -H -R data.html \
| xmlstarlet sel -t -m '//textarea[@name="command"]' -v '.' -o $'\uffff' \
| perl -C -0xFFFF -l0 -pe ''
)
declare -p a
結果:
declare -a a=([0]=$'1 \n newline' [1]=$'2 \n newline')