Есть ли способ, как в верхнем / нижнем регистре только один символ в некоторой строке?
Пример ввода:
syslog_apr_24_30
syslog_mar_01_17
Желаемый вывод:
syslog_Apr_24_30
syslog_Mar_01_17
Обратите внимание, пожалуйста, на верхний регистр начала месяца.
Я пытался, awk
но я не достаточно хорош, чтобы заставить его работать.
sed 's/_./\U&/'
AWK:
источник
Awk
версия с подстрокой и тапперомОбразец прогона:
источник
Использование
awk
:или
пример
источник
Вот подход Perl:
-p
Заставляет каждую строку печатается после применения сценария дается-e
. Подстановка заменяет первый экземпляр_
и последующий за ним символ ($&
независимо от того, что было сопоставлено) в верхнем регистре (uc()
).e
Оператор подстановки в конце (s///e
) необходим для оценки выражений.источник
Другое
perl
:источник
Pure Bash 4.x, используя регулярное выражение для выбора части, которую вы хотите выделить, и
^^
оператора upcase для этой части. Прикрепление спереди и сзади (соответствует. *) Для воссоздания всей строки:Если вы не помните все правила цитирования, можно цитировать все, кроме регулярных выражений (что приведет
=~
к буквальному совпадению строк).Оператор
^
upcase-first работает только в начале переменной (или элемента массива). И, кажется, нет никакого раскрытия подстроки, которое дает вам то, что perl назвал бы lvalue (которое вы можете назначить / изменить). Операторы up / downcase-first могут принимать шаблон, который сопоставляется для каждого символа, но это не помогает пропускатьsyslog_
, потому что есть названия месяцев, которые начинаются с символов в «syslog».Во всяком случае, это может быть быстрее, чем
foo="$(echo "$foo" | sed 's/_./\U&/')"
(опубликовано в качестве комментария к принятому ответу, Гленн Джекман).Bash, Sed или WKK будет во много раз быстрее, чем Perl. Если вы начинаете находить несколько perl-однострочников полезными в сценарии оболочки, вам просто нужно написать все это на perl.
источник
Если месяц всегда следует за первым «_» (подчеркивание), используйте это (как показано в других ответах):
Если перед предыдущим месяцем могут быть другие подчеркивания, то вышеприведенное не сработает.
Если месяц всегда начинается с 8-го символа, используйте это:
источник