2013-08-30 9 views
5

Mam następujący kod HTML:Jak dołączyć do nowej linii po każdym meczu użyciu xmlint --xpath

<textarea name="command" class="setting-input fixed-width" rows="9">1</textarea><textarea name="command" class="setting-input fixed-width" rows="5">2</textarea> 

chciałbym analizować je, aby otrzymać taki wynik:

1 
2 

Obecnie używam:

xmllint --xpath '//textarea[@name="command"]/text()' --html 

, ale nie dołącza on nic po każdym meczu.

+0

W jaki sposób uzyskujesz wyjście? i gdzie to wypróbowałeś? –

+0

@Babai Zakładając, że powyższy kod HTML jest dostępny w pliku f, 'xmllint --xpath '// textarea [@ name =" command "]/text()' --html f' –

+0

Właściwie testowałem to w narzędziu online , a tekst nadchodzi w nowej linii .. więc próbując zrozumieć, gdzie chcesz go wydrukować .. –

Odpowiedz

2

Zrobiłem następujące, brzydki trick, proszę dać lepsze rozwiązanie.

Zmieniono kod HTML zastępując </textarea> z \n</textarea> za pomocą następującego polecenia:

sed 's/\<\/textarea/\'$'\n\<\\/textarea/g' f 
+2

Możesz użyć innych znaków jako separatory dla sed, np. '%', więc nie musisz uciekać z ukośnika. – mkataja

0

Jak zbierać od this SO answer, możliwe jest również do:

xmllint --shell input.xml <<<'cat //textarea[@name="command"]/text()' 

a następnie usunąć "przekładki" (wiersze kresek) na wyjściu z

all that whatnot above | sed '/^ -/d' 

Czuję, że to przybliża cię do tego, co chcesz zobaczyć, jako człowiek, początkowo, i regex, aby usunąć to, co chcesz, jest dużo bardziej oczywiste i precyzyjne.

Użycie tej samej metody w środku potoku prawdopodobnie nie jest możliwe, ponieważ stdin w tym przypadku jest "ciągiem znaków" zawierającym komendę cat dla powłoki xmllint.

Kolejna propozycja w tym samym wątku jest użycie xmlstarlet, jeśli jest to dostępne:

xmlstarlet sel -t -v '//textarea[@name="command"]/text()' input.xml 

... i nadal będzie działać prawidłowo w rurze, powiedzmy, od curl czy coś.

Powiązane problemy