случай заголовка оболочки linux - PullRequest
6 голосов
/ 07 августа 2011

Я пишу сценарий оболочки и у меня есть переменная, подобная этой: something-that-is-hyphenated.

Мне нужно использовать его в различных точках сценария как:

something-that-is-hyphenated, somethingthatishyphenated, SomethingThatIsHyphenated

Мне удалось изменить его на somethingthatishyphenated, убрав - с помощью sed "s/-//g".

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

Редактировать: Рабочая функция, полученная из ответа @ Михала

function hyphenToCamel {
    tr '-' '\n' | awk '{printf "%s%s", toupper(substr($0,1,1)), substr($0,2)}'
}

CAMEL=$(echo something-that-is-hyphenated | hyphenToCamel)
echo $CAMEL

Редактировать: Наконец, один лайнер sed благодаря @ glenn

echo a-hyphenated-string | sed -E "s/(^|-)([a-z])/\u\2/g"

Ответы [ 5 ]

4 голосов
/ 07 августа 2011

GNU sed однострочный

echo something-that-is-hyphenated | 
sed -e 's/-\([a-z]\)/\u\1/g' -e 's/^[a-z]/\u&/'

\u в строке замены задокументировано в руководстве по sed .

4 голосов
/ 07 августа 2011

Чистый bashism:

var0=something-that-is-hyphenated
var1=(${var0//-/ })
var2=${var1[*]^}
var3=${var2// /}
echo $var3
SomethingThatIsHyphenated

Строка 1 тривиальна.
Строка 2 - это bashism для replaceAll или 's/-/ /g', заключенная в скобки, для построения массива.
В строке 3 используется${foo^}, что означает прописные буквы (тогда как ${foo,} будет означать «строчные буквы» [обратите внимание, как ^ указывает вверх, тогда как , указывает вниз]), но для работы с каждой первой буквой слова мы обращаемся ко всему массивус ${foo[*]} (или ${foo[@]}, если вы предпочитаете это).
Строка 4 снова является заменой всех: пусто без ничего.
Строка 5 снова тривиальна.

1 голос
/ 07 августа 2011

Вы можете определить функцию:

hypenToCamel() { 
    tr '-' '\n' | awk '{printf "%s%s", toupper(substr($0,0,1)), substr($0,2)}'
}

CAMEL=$(echo something-that-is-hyphenated | hypenToCamel)
echo $CAMEL
0 голосов
/ 17 февраля 2015

Для записей вот чистый Bash безопасный метод (который не подлежит расширению пути) - с использованием Bash≥4:

var0=something-that-is-hyphenated
IFS=- read -r -d '' -a var1 < <(printf '%s\0' "${var0,,}")
printf '%s' "${var1[@]^}"

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

Если ваша переменная также может содержать пробелы и вы хотите с ними работать, измените IFS=- в IFS='- '.

0 голосов
/ 07 августа 2011

В оболочке вы застряли в беспорядке:

   aa="aaa-aaa-bbb-bbb"
   echo " $aa" | sed -e 's/--*/ /g' -e 's/ a/A/g' -e 's/ b/B/g' ... -e 's/  *//g'

Обратите внимание на аккуратно размещенный пробел в эхе и двойной пробел в последнем -е.упражнение для завершения кода.

В Perl это немного проще, чем однострочная команда оболочки:

perl -e 'print map{ $a = ucfirst; $a =~ s/ +//g; $a} split( /-+/, $ARGV[0] ), "\n"' $aa
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...