В следующем примере показаны несколько значений, отформатированных с использованием строк пользовательского формата, которые включают нулевые заполнители.
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"
Я согласен, что «вырезать» - замечательный инструмент в командной строке. Однако более чисто решение 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##*,}
Этот однострочный perl работает для меня в командной строке, поэтому может быть добавлен в ваш скрипт.
echo 'http://login:password@example.com/one/more/dir/file.exe?a=sth&b=sth' | perl -n -e 'm{http://[^/]+(/[^?]+)};print $1'
Обратите внимание, что это предполагает, что всегда будет '?' символ в конце строки, которую вы хотите извлечь.
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
Лучше всего найти язык с библиотекой синтаксического анализа 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' )
Если у вас есть 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).
Это использует 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 и на этот раз ? в качестве разделителя и укажем ему, чтобы он выдал нам только первое поле.
Фрагмент 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' )