проблема с эхо-сигналом bash

#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'