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\&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&B=2
Run Code Online (Sandbox Code Playgroud)
只是\后面的&被删除了。
为什么?
我敢肯定这是缺少的基本知识。
&是&在 XML 文档中打印的正确方法,但由于您只需要一个普通的 URL,因此您的输出不应是 XML。因此,你需要切换到文本模式,通过传递--text或者-T在sel命令。
您的示例输入不太有效,因为 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)