Как использовать строку в панцире рыбы с большой буквы?

Я получил такой текст:

Lorem ipsum dolor sit amet, conctetur adipisicing elit.

Я хочу использовать заглавные буквы, т.е. первую букву каждого слова в верхнем регистре.

Ожидаемый результат

Lorem Ipsum Dolor Sit Amet, Consectetur Adipisicing Elit.

Эквивалент Bash

Используя bash, я использовал расширение параметра:

function to-lower() { echo "$@" |tr '[:upper:]' '[:lower:]' ; }

function capitalize() {
    input="$(to-lower "$@")"
    for i in $input; do
        cap=$(echo -n "${i:0:1}" | tr "[:lower:]" "[:upper:]")
        echo -n "${cap}${i:1} "
    done
    echo
}

Вопрос

Как мне сделать это по-рыбному?


person Édouard Lopez    schedule 10.12.2015    source источник


Ответы (3)


У Fish в настоящее время нет инструментов для этого (в выпуске), поэтому, если у вас есть GNU sed, вы можете сделать это:

function capitalize
    echo $argv | sed 's/[^ _-]*/\u&/g'
end

Есть также множество других инструментов, вы также можете сделать это, например, python или вызвав bash из fish, суть в том, что нет возможности ни извлечь подстроку, ни заменить символ встроенными командами fish.

В следующем выпуске Fish вы сможете использовать string sub -l 1 $i для извлечения первого символа.

person faho    schedule 10.12.2015
comment
Я действительно не люблю string util, он действительно многословный, но неясный. Я, вероятно, буду придерживаться внешнего инструментального решения, поскольку оно не зависит от оболочки. - person Édouard Lopez; 11.12.2015
comment
Я переношу свои существующие точечные файлы bash / zsh на рыбалку, см. .my-posixrc и .my-fishrc - person Édouard Lopez; 11.12.2015
comment
@faho IDK, почему, но это решение не работает для меня. Fish v2.3.1 и gnu-sed 4.2.2 - person Alex Guerrero; 18.09.2016
comment
Да, это регулярное выражение было нарушено. Я исправил это. - person faho; 18.09.2016

Ни одно из предыдущих решений у меня не работает. Кажется, что sed плохо работает на моей машине. Если у кого-то возникнет подобная проблема, это обходной путь, который я, наконец, использовал:

function title_case -a string
  set -l matches (string match -r -a '\b[a-z]' $string)

  for match in $matches
    set -l upper (echo $match | tr a-z A-Z)
    set string (echo (string replace -r '\b[a-z]' $upper $string))
  end

  echo $string
end

Работает только в версии fish 2.3.0 или новее, так как я использую встроенную string

person Alex Guerrero    schedule 18.09.2016
comment
Я пробовал это сейчас, и, похоже, он работает, как ожидалось, пользователю нужен вариант Title Case - без исключений для, и ... - и вот как эта функция работает. Может быть, вам нужно что-то вроде функции верхнего регистра? Если это не так, какую версию рыбьего панциря вы используете? - person Alex Guerrero; 29.11.2016
comment
да, моя ошибка. хотя он был ВЕРХНИМ. - person Olivier Refalo; 02.12.2016

Решение с использованием внешнего инструмента (из commandlinefu)

function capitalize
    set input "$argv"
    echo "$input" | tr '[A-Z]' '[a-z]' | sed 's/\(^\| \)\([a-z]\)/\1\u\2/g'
end

использование

capitalize "Lorem ipsum dolor sit amet, consectetur adipisicing elit."                                                                        

Lorem Ipsum Dolor Sit Amet, Consectetur Adipisicing Elit.

person Édouard Lopez    schedule 10.12.2015