Почему sed не может обрабатывать вывод по конвейеру из xpath? - PullRequest
3 голосов
/ 17 октября 2011

При попытке запустить следующее в Терминале в Mac OS Lion вместо получения первой строки в качестве вывода, я просто получаю вывод из xpath.

curl -s http://wordsmith.org/awad/rss1.xml | xpath //item/description | sed q

Выходы:

Found 1 nodes:
-- NODE --

<description>...</description>

Вместо:

Found 1 nodes:

Почему sed не может обработать вывод из xpath ?Чего мне не хватает?

Ответы [ 6 ]

3 голосов
/ 17 октября 2011

У меня нет Mac OS, но я могу догадаться о вашей проблеме. Если я сделаю эквивалент под Linux, я получу следующий вывод:

$ curl -s http://wordsmith.org/awad/rss1.xml | xpath -e "//item/description"  | sed q
Found 1 nodes in stdin:
-- NODE --
<description>Ending life for humane reasons, such as to avoid pain from an incurable condition.</description>

Это потому, что часть вывода собирается в stdout, а часть - в stderr. Так что, если я перенаправлю все на стандартный вывод, я получу это,

$ curl -s http://wordsmith.org/awad/rss1.xml | xpath -e "//item/description" 2>&1  | sed q
Found 1 nodes in stdin:
1 голос
/ 17 октября 2011

У меня нет точного ответа, но я столкнулся с этой точной проблемой.Хотя я использовал awk не sed.Решением было установить флаг -q.Также вы забыли флаг -e, чтобы идентифицировать выражение.Это может иметь отношение к тому, что я на Ubuntu, а ты на OSX.но мой вывод был таким же.

так что вы хотите

curl -s <a href="http://wordsmith.org/awad/rss1.xml" rel="nofollow">http://wordsmith.org/awad/rss1.xml</a> | xpath -q -e //item/description | sed q

СИНОПСИС

   xpath [-s suffix] [-p prefix] [-q] -e query [-e query] ... [file] ...

-q

   Be quiet. Output only errors (and no separator) on stderr.
0 голосов
/ 17 октября 2018

Очень поздно, но у меня недавно была похожая проблема в bash-скрипте, в котором я пытался подавить «Found # node:», за которым следует «--- NODE ---» для каждого возвращаемого элемента выше значенийкоманда вставляла в массив.

Например:

Found 9 nodes:
-- NODE --
-- NODE --
-- NODE --
-- NODE --
-- NODE --
-- NODE --
-- NODE --
-- NODE --
-- NODE --
Please select your option from the menu:
1) Option 1
2) Option 2
etc.

Я исправил это, перенаправив STDERR в 2>/dev/null в моем аргументе xpath.Это исключило «Найденные # узлы» и вернул только тот массив, который я загрузил в меню выбора.Надеюсь, что это поможет тому, кто столкнется с этим в будущем.

0 голосов
/ 15 мая 2014

Если у вас нет флага -q в OS X, вы можете закомментировать те строки, которые печатают «- NODE -» и «Найденные узлы x». Как то так:

murphy:~ pdurbin$ diff -u /usr/bin/xpath5.12.orig /usr/bin/xpath5.12
--- /usr/bin/xpath5.12.orig 2012-12-06 06:29:14.000000000 -0500
+++ /usr/bin/xpath5.12  2014-05-15 14:32:14.000000000 -0400
@@ -48,17 +48,18 @@
 }

 if ($nodes->size) {
-   print STDERR "Found ", $nodes->size, " nodes:\n";
+   #print STDERR "Found ", $nodes->size, " nodes:\n";
    foreach my $node ($nodes->get_nodelist) {
-       print STDERR "-- NODE --\n";
+       #print STDERR "-- NODE --\n";
        print $node->toString;
+       print "\n";
    }
 }
 else {
    print STDERR "No nodes found";
 }

-print STDERR "\n";
+#print STDERR "\n";

 exit;

murphy:~ pdurbin$ 
0 голосов
/ 10 февраля 2014

У меня есть дополнительная информация, которая может дать больше ясности в вопросе и даже решить некоторые проблемы, как это было у меня. Обнаруженные ошибки частично связаны с версией xpath, которую вы используете.

Флаг -q quiet доступен в версии, которую я установил в своей системе Ubuntu через apt-get, но не доступен в версиях, установленных в OSX или RHEL. Существуют также небольшие синтаксические различия между версиями, такие как порядок запроса и ввод данных.

Но самая полезная часть заключается в том, что вы можете скопировать версию Ubuntu, установленную в других системах, и она отлично работает с остальной частью уже установленной библиотеки xpath. Вам нужно установить xpath и затем просто перенести основной скрипт xpath (обычно в / usr / bin / xpath). Затем вы можете воспользоваться чрезвычайно полезным параметром -q и пропустить постобработку sed / regex.

0 голосов
/ 27 июня 2012

На OSX 10.7.4 Я не совсем уверен, что вы хотели в качестве вывода.Я хотел избавиться от STDERR («Найдено X узлов ...») и распечатать только фактический элемент (фактическое название и описание).Надеюсь, это поможет.

> cat wordsmith.sh 

#!/bin/bash
/usr/bin/curl -s http://wordsmith.org/awad/rss1.xml > file.xml
title=`xpath file.xml //item/title 2> /dev/null | sed 's/<[^>]\*>//g'`
description=`xpath file.xml //item/description 2> /dev/null | sed 's/<[^>]*>//g'` 
echo $title : $description
/bin/rm file.xml

> ./wordsmith.sh 
versal : Universal; whole.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...