Вырезать переменный ввод bash после пробела

#bash

Вопрос:

Я использую этот bash cmd / var, чтобы получить последнюю ссылку для загрузки Android Studio для Linux:

 URL=$(wget "http://developer.android.com/sdk/index.html" -O - | grep -o "https://redirector.gvt1.com/edgedl/android/studio/ide-zips/[0-9.]*/android-studio-[0-9.]*-linux.tar.gz")
 

Когда я повторяю var, я получаю это:

 [root@fedora tmp]# echo $URL
https://redirector.gvt1.com/edgedl/android/studio/ide-zips/2020.3.1.22/android-studio-2020.3.1.22-linux.tar.gz https://redirector.gvt1.com/edgedl/android/studio/ide-zips/2020.3.1.22/android-studio-2020.3.1.22-linux.tar.gz
[root@fedora tmp]# 
 

Что я могу сделать, чтобы ссылка была только один раз в var , я попробовал с head ней, cut awake но ничего не получилось.

Комментарии:

1. Вы получаете несколько ссылок, потому что регулярное выражение совпадает несколько раз (они находятся в одной строке, потому что вы не используете кавычки при выводе var). Предполагая, что первая ссылка всегда будет правильной, добавление | head -n1 в ваш конвейер после grep должно сделать свое дело. Довольно большое предположение, хотя

Ответ №1:

wget возвращает более одной строки (и grep является фильтром для каждой строки). Чтобы принять только первую строку, используйте « | head -1 » после grep команды :

URL=$(wget --quiet "http://developer.android.com/sdk/index.html" -O - | grep -o "https://redirector.gvt1.com/edgedl/android/studio/ide-zips/[0-9.]*/android-studio-[0-9.]*-linux.tar.gz" | head -1)

Я добавил опцию «`—quiet» в команду wget для более удобочитаемого вывода в терминале.

Арно под GNU/Linux Fedora

Комментарии:

1. без head «может grep -om1 быть»?

Ответ №2:

Я подозреваю, что пробел, разделяющий два вхождения URL-адреса, кажется, ведет себя не так, как ожидалось, со всеми видами команд.

Поскольку я не могу объяснить, что происходит, я собирался предложить вам обходной путь после загрузки с wget помощью ; просто проблема:

 URL=${URL%?https*}
 

чтобы избавиться от второго URL-адреса и таинственного символа, разделяющего оба события.

Но когда я увидел ответ Арно Вальмари выше, я должен признать, что он нашел правильное объяснение и правильное решение. Кредиты ему.

Ответ №3:

ПРИМЕЧАНИЕ: Не ответ; просто расширяю некоторые другие комментарии …

Когда мы ссылаемся на переменную и не получаем ожидаемого результата, подумайте о том, чтобы посмотреть на команды, используемые для создания того, что присваивается переменной. В этом случае, если мы отложим URL=$(...) задание и просто запустим wget|grep в командной строке:

 $ wget "http://developer.android.com/sdk/index.html" -O - 2>amp;1 | grep -o "https://redirector.gvt1.com/edgedl/android/studio/ide-zips/[0-9.]*/android-studio-[0-9.]*-linux.tar.gz
 

ПРИМЕЧАНИЕ: Я добавил 2>amp;1 , чтобы заставить несколько строк stderr перейти в stdout.

Это приводит к следующему:

 https://redirector.gvt1.com/edgedl/android/studio/ide-zips/2020.3.1.22/android-studio-2020.3.1.22-linux.tar.gz
https://redirector.gvt1.com/edgedl/android/studio/ide-zips/2020.3.1.22/android-studio-2020.3.1.22-linux.tar.gz
 

Сохраните это в URL переменной, и мы получим:

 $ URL=$(wget ... | grep ...)
$ typeset -p URL
declare -- URL="https://redirector.gvt1.com/edgedl/android/studio/ide-zips/2020.3.1.22/android-studio-2020.3.1.22-linux.tar.gz
https://redirector.gvt1.com/edgedl/android/studio/ide-zips/2020.3.1.22/android-studio-2020.3.1.22-linux.tar.gz"
 

Обратите внимание, что переменная имеет встроенный возврат каретки (т. Е. Данные хранятся в виде 2 строк).

Итак, как это выглядит с echo точки зрения:

 $ echo $URL        # no double quotes => prints everything on single line:
https://redirector.gvt1.com/edgedl/android/studio/ide-zips/2020.3.1.22/android-studio-2020.3.1.22-linux.tar.gz https://redirector.gvt1.com/edgedl/android/studio/ide-zips/2020.3.1.22/android-studio-2020.3.1.22-linux.tar.gz

$ echo "$URL"      # wrapped in double quotes and the embedded carriage return is maintained
https://redirector.gvt1.com/edgedl/android/studio/ide-zips/2020.3.1.22/android-studio-2020.3.1.22-linux.tar.gz
https://redirector.gvt1.com/edgedl/android/studio/ide-zips/2020.3.1.22/android-studio-2020.3.1.22-linux.tar.gz
 

Другие уже рассмотрели, как ограничить/отфильтровать то, что хранится внутри URL