Учитывая вывод, что HTTP URI, как представляется сложным HTML с линией, как:
<21 spaces><li>State/Province : Western Australia</li>
Я не могу на самом деле увидеть, как что трубопровод будет работать даже дал вам, кажется, отрезав "State/Province : "
(и, возможно, W
(N
в вашем случае)), прежде чем вы даже начнете поиск строк, содержащих "e :"
.
Вам было бы намного лучше извлечь правильную строку сначала, а затем просто захватить соответствующий текст с помощью более адаптивной команды, чем cut
.
Что-то, как это должно быть хорошее начало:
curl -s http://www.ipinfodb.com/my_ip_location.php
| awk '$1 == "<li>State/Province" && $2 == ":" {
$1 = "";
$2 = "";
gsub ("</li>", "");
print
}
{}'
| sed 's/^ *//'
awk
является одного команда, которая будет выбирать строки, в которых первые два столбца соответствуют тому, что вам нужно, установите эти столбцы пустые строки, удалить конечный тег </li>
и выводят результат.
sed
будет просто удалять ведущие пространства из-за того, что awk
по-прежнему будет выводить пробелы между пустыми столбцами в начале.
Таким образом, вам не нужно беспокоиться о незначительных вариациях в линейном формате, если, например, они начинают вкладывать больше пробелов или отступать от вкладок, а не пробелов. Вам все равно придется беспокоиться об изменении основных изменений, таких как изменение "State/Province"
бит, но они должны быть гораздо менее вероятными.
Часть проблемы заключается в том, что ваш вывод содержит невидимые символы, включая возврат каретки (который заставляет его вернуться к началу строки, а затем есть пробел, который перезаписывает «N» ...). Попробуйте 'echo '$ State" | cat -vet', чтобы увидеть невидимые (возврат каретки будет отображаться как «^ M»). –