2012-12-21 2 views
0


XPath의 요소를 검사하는 데 도움이되는 몇 가지 Linux 쉘 명령을 찾고 있습니다. 예를 들어
는 주어진 : 나는 세 가지 명령이 각각 반환해야xpath의 bash 명령 분할 요소

/a[@e=2]/bee/cee[@e<9]/@dee 

:

a 
[@e=2] 
/bee/cee[@e<9]/@dee 

나중에 내가 모든 XPath는을 분석하기 위해, 과정을 반복 할 수 있습니다.

나는 sed과 정규식을 사용해 보았지만 할 수 없었다.

+0

왜이 방법으로 분할하고 있습니까? 왜''@e = 2 ',''bee'','cee [@e <9]','@dee'입니까? 무엇을 성취하려고합니까? 왜 이것을 셸 스크립트로 만들려고합니까? Ruby 나 Python과 같은 고급 언어가 아닌데 왜 이런 종류의 일에 더 적합할까요? – larsks

+0

여기를 검색하셨습니까? '[linux] [xml]'은 103,'[sed] [xml]'yields ~ 30 등 ... 더 나은 것은'[xmlstarlet]'를 검색하는 것입니다. 행운을 빕니다. – shellter

+0

@larsks : 당신 말이 맞습니다. 그러나 제가 이미 bash 스크립트의 중간에있을 때 문제가 발생했습니다. – user1922691

답변

0

이상한 요청 ... sed으로 ^/\([-a-zA-Z0-9_]*\)\(\[[^]]*\]\)\(.*\)$으로 쉽게 처리 할 수 ​​있습니다. 귀하가 요청한 세그먼트는 세 가지 캡처입니다.

zsh% data='/a[@e=2]/bee/cee[@e<9]/@dee' 
zsh% pattern='^/\([-a-zA-Z0-9_]*\)\(\[[^]]*\]\)\(.*\)$' 
zsh% sed "s#$pattern#\1#" <($data) 
a 
zsh% sed "s#$pattern#\2#" <($data) 
[@e=2] 
zsh% sed "s#$pattern#\3#" <($data) 
/bee/cee[@e<9]/@dee 
zsh% 

패턴은 요청에 매우 특화되어 있습니다. XPath 표현식은 껍질에서 찢어지기가 꽤 까다 롭고 비싸다. 당신이 성취하고자하는 것에 따라 언어 취향에 따라 쉘 스크립트를 Python, Ruby 또는 Perl로 번역하는 것이 더 나을 것입니다. Bash 대신 zsh을 사용하는 방법을 살펴볼 수도 있습니다. 고급 스크립팅에 훨씬 더 능숙하다는 것을 알았습니다.

+0

아름다운! 그것은 작동합니다! 제 설정에서 리다이렉션이 작동하지 않습니다 : echo $ data | sed "# $ pattern # \ 1 #" – user1922691

+0

리디렉션은 zsh 구문이므로 echo $ data | sed '속임수로 속임수를 쓴다. –

+0

xpaths에서 [...] 부분은 필수가 아니며 노드 이름에 문자와 숫자 이외의 다른 기호가 포함될 수 있으므로이 패턴은 개선 된 패턴입니다 :'^/\ ([^/\ [] * \) \ (\ [[^]] * \] \) \? \ (. * \) $ '' – user1922691