2017-09-16 7 views
1

이 작업은 상당히 짜증나지만 훨씬 간단합니다. 나는 성공적으로 테이블에서 각 링크를 추출하고 모든 것을 대신 &앰퍼샌드을 재현하지만, 제대로 연결된됩니다 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 \ 

내가 말에이 나타납니다이 guide에 따르면,이 썼다 각 링크 :

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

이미 살펴본 바와 같이 백 슬래시 이스케이프는 해결책이 아닙니다. 나는 두 가지 옵션을 생각할 수 있습니다 :

가하는 HREF를 추출 (아마 모두xmllintxmlstarlet이 할 를 사용 할 필요가 없습니다), 다음 시작에 불과을 추가하는 등 sed 같은 표준 텍스트 처리 도구를 사용하여 그리고 말 : 또는

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

안녕하세요 @nostavs, 내 스크립트를 정말 간단하게 만듭니다. 내 케이스의'--if'는 추출 할 모든 링크에 기본 URL이 없기 때문에 중복됩니다. Elsewise, 그것은 잘 작동합니다. 건배! –