Как сделать grep в переменной? Я сохранил вывод wget в переменной, и мне нужно извлечь некоторые строки из него. Как и содержимое переменной
upgrade http://wordpress.org/download/ http://wordpress.org/wordpress-3.0.5.zip 3.0.5 en_US 4.3 4.1.2
, мне нужно проверить, содержит ли строка слово upgrade
, поэтому я могу выполнить простой grep, а затем проверить состояние выхода из него с помощью $?
и продолжить.
Как я могу получить значение 3.0.5
, которое на самом деле является четвертым словом?
А как на самом деле grep в переменной?
Вместо того, чтобы искать, возможно просто используйте cut
. Это будет намного быстрее, чем запуск полного регулярного выражения.
STRING="upgrade http://wordpress.org/download/ http://wordpress.org/wordpress-3.0.5.zip 3.0.5 en_US 4.3 4.1.2"
echo "$STRING" | cut -d" " -f4
Выходы: 3.0.5
Это может быть немного более надежным, хотя (захватывает версию из почтового URL):
echo "$STRING" | sed -n -e 's/.*wordpress-\(.*\)\.zip.*/\1/p'
Если вы хотите сохранить это обратно в переменную bash, просто оберните это в кавычки и обратные кавычки. Часть с обратным тэгом будет выполняться первой, оставляя ее как строку.
RESULT="`echo "$STRING" | sed -n -e 's/.*wordpress-\(.*\)\.zip.*/\1/p'`"
Итак, что касается разбивки (в соответствии с вашим комментарием) на поиск upgrade
в начале:
STRING="upgrade http://wordpress.org/download/ http://wordpress.org/wordpress-3.0.5.zip 3.0.5 en_US 4.3 4.1.2"
if [[ $STRING == upgrade* ]]; then
VERSION="`echo "$STRING" | sed -n -e 's/.*wordpress-\(.*\)\.zip.*/\1/p'`"
# do something else now
else
# do something if this isn't an upgrade (optional)
fi
В дополнение к общему вопросу вы должны знать, что вы также можете использовать grep
, если строка содержит несколько строк и вы хотите найти строку, содержащую определенное слово.
Пример:
STRING="Some lines
with the word one
and the word two"
использовать grep, чтобы найти строку со словом «one», использовать echo с указанной в кавычке переменной:
echo "$STRING" | grep one
Если вы просто ищете слово, вы можете использовать цикл for.
STRING="upgrade this if you can" for x in $STRING; do echo $x if [ "$x" = 'upgrade' ]; then echo found y=$x break fi done echo $y
Если обновление всегда в одной и той же позиции, вы можете попробовать присвоение массива.
declare -a z z=($STRING) echo ${z[0]}