通过 XMLStarlet 取消 & 符号 (&) - Bugging &

Ava*_*lla 4 bash shell escaping wget 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 \
Run Code Online (Sandbox Code Playgroud)

我成功地提取从表中的每个环节和一切都被正确地连接在一起,然而,而不是再现符号我收到这在每一个环节的结尾:

https://example.com/hello-world/?A=1\&amp;B=2
Run Code Online (Sandbox Code Playgroud)

但实际上,我正在寻找类似的东西:

https://example.com/hello-world/?A=1&B=2
Run Code Online (Sandbox Code Playgroud)

这个想法是使用反斜杠转义字符,\&以便它被忽略。最初,在这种情况下,我尝试将其直接放入-o "\&" \而不是-o "$ampersand" \删除ampersand=$(echo '\&')。结果还是一样。

本质上,通过删除反斜杠它仍然输出:

https://example.com/hello-world/?A=1&amp;B=2
Run Code Online (Sandbox Code Playgroud)

只是\后面的&amp;被删除了。

为什么?

我敢肯定这是缺少的基本知识。

npo*_*avs 5

&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
Run Code Online (Sandbox Code Playgroud)

输出是

http://www.iana.org/domains/example/?A=1&B=2
Run Code Online (Sandbox Code Playgroud)