#bash #sed #echo
#bash #sed #эхо
Вопрос:
Вот скрипт bash, который извлекает некоторые данные из HTML-файла.
price=`grep ' <td>$' $1 | sed -e 's/<td>//g' -e 's:</td>::g' -e 's/$ //g' -e 's/^ *//g'`
grep ' <td>$' $1 | sed -e 's/<td>//g' -e 's:</td>::g' -e 's/$ //g' -e 's/^ *//g'
echo "Price: $price"
Часть sed могла бы нуждаться в некоторой помощи, но проблема здесь не в этом. Проблема в том, что, когда я запускаю скрипт, он должен дважды напечатать найденное значение, верно? Но он печатает его только один раз, в первый раз (без ‘Price:’). В чем здесь проблема?
Ответ №1:
Проблема в том, что возвращаемая вами строка содержит r
, которая возвращает курсор в первый столбец перед выводом содержимого. Используйте od -c
для проверки. И используйте соответствующий инструмент, такой как xmlstarlet
, чтобы убедиться, что этого не произойдет.
Ответ №2:
Первый grep считывает все данные со стандартного ввода. Затем второй grep блокирует попытку чтения из stdin.
Ответ №3:
Я предполагаю, что в отличие от показанного кода, присвоение фактически происходит в подоболочке и, следовательно, не отображается (теряется при выходе из подоболочки)
Боюсь, вы столкнулись с проблемой подоболочки, которую вы здесь не показываете. Опубликуйте больше кода, который вы действительно используете, если сможете.
— Пример:
unset price
price=1
echo $price # works
unset price
echo -n 1 | price=$(cat)
echo $price # works _not_
Комментарии:
1. Кода больше нет, это весь скрипт (ну, часть с переменной есть). Он выполняется на этом: apparelorder.com/Productview.Asp?ProID=528844
2. Хорошо. Тогда шансы смещаются в сторону гипотезы » r», упомянутой Игнасио
3. PS. Нет необходимости упоминать, на каких ботинках вы бегали , хахахаха
Ответ №4:
Пара комментариев о вашем использовании sed:
-e 's/^ *//g'
— вам не нужен символ «g»: ваш шаблон привязан в начале, поэтому он может совпадать только один раз. С таким же успехом можно было бы поискать и вкладки: -e 's/^[[:space:]]{1,}//'
-e 's/<td>//g' -e 's:</td>::g'
может быть свернуто в -e 's|</{0,1}td>||g'