Извлеките имя файла и путь от URL в сценарии удара

В следующем примере показаны несколько значений, отформатированных с использованием строк пользовательского формата, которые включают нулевые заполнители.

String.Format("{0:N1}", 29255.0);

Или

29255.0.ToString("N1")

результат "29,255.0"

String.Format("{0:N2}", 29255.0);

Или

29255.0.ToString("N2")

результат "29,255.00"

25
задан Arek 29 August 2009 в 09:05
поделиться

7 ответов

Я согласен, что «вырезать» - замечательный инструмент в командной строке. Однако более чисто решение bash заключается в использовании мощной функции расширения переменных в bash. Например:

pass_first_last='password,firstname,lastname'

pass=${pass_first_last%%,*}

first_last=${pass_first_last#*,}

first=${first_last%,*}

last=${first_last#*,}

or, alternatively,

last=${pass_first_last##*,}
1
ответ дан Roger 28 November 2019 в 06:00
поделиться

Этот однострочный perl работает для меня в командной строке, поэтому может быть добавлен в ваш скрипт.

echo 'http://login:password@example.com/one/more/dir/file.exe?a=sth&b=sth' | perl -n -e 'm{http://[^/]+(/[^?]+)};print $1'

Обратите внимание, что это предполагает, что всегда будет '?' символ в конце строки, которую вы хотите извлечь.

-1
ответ дан ire_and_curses 28 November 2019 в 06:00
поделиться

gawk

echo "http://login:password@example.com/one/more/dir/file.exe?a=sth&b=sth" | awk -F"/" '
{
 $1=$2=$3=""
 gsub(/\?.*/,"",$NF)
 print substr($0,3)
}' OFS="/"

output

# ./test.sh
/one/more/dir/file.exe
2
ответ дан 28 November 2019 в 06:00
поделиться

Лучше всего найти язык с библиотекой синтаксического анализа URL:

url="http://login:password@example.com/one/more/dir/file.exe?a=sth&b=sth"
path=$( echo "$url" | ruby -ruri -e 'puts URI.parse(gets.chomp).path' )

или

path=$( echo "$url" | perl -MURI -le 'chomp($url = <>); print URI->new($url)->path' )
1
ответ дан 28 November 2019 в 06:00
поделиться

Если у вас есть gawk:

$ echo 'http://login:password@example.com/one/more/dir/file.exe?a=sth&b=sth' | \
  gawk '$0=gensub(/http:\/\/[^/]+(\/[^?]+)\?.*/,"\\1",1)'

или

$ echo 'http://login:password@example.com/one/more/dir/file.exe?a=sth&b=sth' | \
  gawk -F'(http://[^/]+|?)' '$0=$2'

Gnu awk может использовать регулярные выражения в качестве разделителей полей (FS).

2
ответ дан 28 November 2019 в 06:00
поделиться

Это использует bash и cut как другой способ сделать это. Уродливо, но работает (по крайней мере, для примера). Иногда мне нравится использовать то, что я называю разрезным ситом, чтобы сократить информацию, которую я действительно ищу.

Примечание: С точки зрения производительности это может быть проблемой.

С учетом этих предостережений:

Сначала давайте повторим строку:

echo 'http://login:password@example.com/one/more/dir/file.exe?a=sth&b=sth'

Что дает нам:

http: // login: password@example.com/one/more/dir/file.exe?a=sth&b=sth[1299 visibleТогда давайте разрежем строку в @ , чтобы было удобно вырезать http: // логин: пароль :

echo 'http://login:password@example.com/one/more/dir/file.exe?a=sth&b=sth' | \
cut -d@ -f2

Это дает нам следующее:

example.com/one/more/dir/file.exe?a=sth&b=sth

Чтобы избавиться от имени хоста , давайте сделаем еще один разрез и будем использовать / в качестве разделителя, попросив cut предоставить нам второе поле и все, что после (по сути, до конца строки). Выглядит это так:

echo 'http://login:password@example.com/one/more/dir/file.exe?a=sth&b=sth' | \
cut -d@ -f2 | \
cut -d/ -f2-

Что, в свою очередь, дает:

one / more / dir / file.exe? A = sth & b = sth

И, наконец, мы хотим убрать все параметры из конец. Опять же, мы будем использовать cut и на этот раз ? в качестве разделителя и укажем ему, чтобы он выдал нам только первое поле.

7
ответ дан 28 November 2019 в 06:00
поделиться

Фрагмент Perl интригует, и, поскольку Perl присутствует в большинстве дистрибутивов Linux, весьма полезен, но ... Он не выполняет свою работу полностью. В частности, существует проблема при преобразовании формата URL / URI из UTF-8 в путь Unicode. Приведу пример проблемы. Исходный URI может быть:

file:///home/username/Music/Jean-Michel%20Jarre/M%C3%A9tamorphoses/01%20-%20Je%20me%20souviens.mp3

Соответствующий путь будет следующим:

/home/username/Music/Jean-Michel Jarre/Métamorphoses/01 - Je me souviens.mp3

% 20 стал пробелом, % C3% A9 стал «é». Есть ли команда Linux, функция bash или сценарий Perl, которые могут обработать это преобразование, или мне нужно написать огромную серию замен подстроки sed? А как насчет обратного преобразования пути в URL / URI?

(Продолжение)

Глядя на http://search.cpan.org/~gaas/URI-1.54/URI.pm , я впервые увидел метод as_iri, но он явно отсутствовал в моем Linux (или почему-то неприменим). Оказывается, решение состоит в том, чтобы заменить часть «-> путь» на «-> файл». Затем вы можете разбить это дальше, используя базовое имя, имя каталога и т. Д. Решение таково:

path=$( echo "$url" | perl -MURI -le 'chomp($url = <>); print URI->new($url)->file' )

Как ни странно, использование «-> dir» вместо «-> file» НЕ извлекает часть каталога: скорее, оно форматирует URI поэтому его можно использовать в качестве аргумента для mkdir и т.п.

(Дальнейшие действия)

Есть ли причина, по которой строка не может быть сокращена до этого?

path=$( echo "$url" | perl -MURI -le 'print URI->new(<>)->file' )
2
ответ дан 28 November 2019 в 06:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: