Как я могу обрезать "/" с помощью сценариев оболочки? - PullRequest
4 голосов
/ 04 июня 2011

Я играл с небольшим сценарием оболочки, чтобы получить некоторую информацию со страницы HTML, загруженной с помощью lynx.

Моя проблема в том, что я получаю эту строку: <span class="val3">MPPTN: 0.9384</span></td>

Я могу обрезать первую часть этого, используя:

trimmed_info=`echo ${info/'<span class="val3">'/}`

И строка становится: "MPPTN: 0.9384"

Но как я могу обрезать последнюю часть?Похоже, что "/" портит команду echo ... Я попытался:

echo ${finalt/'</span></td>'/};

Ответы [ 4 ]

6 голосов
/ 04 июня 2011

Не уверен, что использование sed в порядке - один из способов извлечь число может быть что-то вроде ...

 echo '<span class="val3">MPPTN: 0.9384</span></td>' | sed 's/^[^:]*..//' | sed 's/<.*$//'
4 голосов
/ 04 июня 2011

Поведение ${VARIABLE/PATTERN/REPLACEMENT} зависит от того, какую оболочку вы используете, и для bash, какая версия.При ksh или в достаточно недавних (думаю ≥ 4.0) версиях bash ${finalt/'</span></td>'/} удаляет эту подстроку по желанию.В старых версиях bash цитирование довольно странное;вам нужно написать ${finalt/<\/span><\/td>/} (который все еще работает в более новых версиях).

Поскольку вы удаляете суффикс, вы можете использовать вместо него конструкцию ${VARIABLE%PATTERN} или ${VARIABLE%%PATTERN}.Здесь вы удаляете все после первого </, то есть самого длинного суффикса, соответствующего шаблону </*.Точно так же вы можете удалить ведущие теги HTML с помощью ${VARIABLE##PATTERN}.

trimmed=${finalt%%</*}; trimmed=${trimmed##*>}

Дополнительное преимущество: в отличие от ${…/…/…}, которое характерно для bash / ksh / zsh и работает немного по-разному во всех трех, ${…#…} и ${…%…} полностью переносимы.Они делают не так много, но здесь их достаточно.

Примечание: хотя в данном конкретном случае это не вызывает никаких проблем, вы всегда должны ставить двойные кавычки вокруг подстановок переменных , например

echo "${finalt/'</span></td>'/}"

В противном случае оболочка будет расширять символы подстановки и пробелы в результате.Простое правило заключается в том, что если у вас нет веских оснований опускать двойные кавычки, вы их ставите.

2 голосов
/ 04 июня 2011

Решение во многом зависит от того, что точно вы хотите сделать. Если все ваши строки будут иметь вид <span class="val3">XXXXX: X.XXXX</span></td>, то самое простое решение -

echo $info | cut -c 20-32

Если они имеют форму <span class="val3">variable length</span></td>, то самое простое решение -

echo $info | sed 's/<span class="val3">//' | sed 's/<\/span><\/td>//'

Если оно более общее, вы можете использовать регулярные выражения, как в ответе Саи.

1 голос
/ 04 июня 2011

Я бы рекомендовал использовать команду sed для такого рода вещей:

echo "$string" | sed "s/$regex/$replace/"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...