Разбор строки символ за символом в сценарии оболочки - PullRequest
1 голос
/ 05 сентября 2011

Я пытаюсь разобрать URL-адрес, чтобы извлечь из него какой-либо текст, чтобы я мог использовать его для переименования своего файла при загрузке. В основном я хочу написать сценарий оболочки, чтобы сделать это. Я хотел бы собрать URL-адрес в строку, а затем проанализировать его символ за символом. Как это можно сделать в сценарии оболочки ???

Ответы [ 3 ]

0 голосов
/ 05 сентября 2011

Вы можете прочитать строку char-by-char, используя синтаксис Substring Expansion:

${parameter:offset:length}

Пример:

str="abcd"
char=${str:1:1} # => "b"

И получите длину строки с синтаксисом Parameter length:

${#parameter}

Пример:

${#str}

Таким образом, вы можете перебирать символы, используя это:

for (( i = 0; i < ${#str}; ++i)); do
    echo "${str:$i:1}"
done

Из руководства по bash:

${#parameter}

Parameter length. Длина в символах значения parameter подставляется.

1029 *

${parameter:offset}
${parameter:offset:length}

Substring Expansion. Расширяется до длины символов parameter, начиная с символа, указанного в offset.

0 голосов
/ 05 сентября 2011
url='http://youtube.com/watch?v=Od3xkrxcsE8&feature=relmfu'
url=${url#*v=}
url=${url%%&*}

или вы можете использовать sed, который менее эффективен (запускает внешнюю команду), но более гибок и для более сложных случаев также более удобочитаем.

url='http://youtube.com/watch?v=Od3xkrxcsE8&feature=relmfu'
url=$(printf '%s' "$url" | sed 's+.*v=\([^&]*\).*+\1+')

Обратите внимание, что в shell (/bin/sh), ${var#prefix-pattern} и ${var%suffix-pattern} - это доступные только функции манипуляции со строками.В bash или zsh у вас есть намного больше, но всегда помните, что вы используете такое расширение, потому что некоторые системы имеют более простую оболочку, установленную как /bin/sh, а некоторые (обычно другие разновидности Unix)чем Linux или встроенные системы) системы вообще не имеют bash.

0 голосов
/ 05 сентября 2011

Это даст вам имя файла для сохранения:

url="http://www.example.com/path?foo#bar"
echo $(basename "${url%%[?#]*}")
# => "path"

Как это работает:

  • "${url%%[?#]*}" удаляет любую вещь после ? и # (удаляет запрос и хеш)
  • $(basename "...") возвращает последний компонент пути (часть после последнего /)
...