Ответ 1
s/\(get[A-Z][A-Za-z0-9]*_\)\([A-Z]\)/\1\L\2/g
Тест:
$ echo 'getFoo_Bar' | sed -e 's/\(get[A-Z][A-Za-z0-9]*_\)\([A-Z]\)/\1\L\2/g'
getFoo_bar
Я хотел бы изменить следующие шаблоны:
getFoo_Bar
в
getFoo_Bar
(обратите внимание на нижний b)
Не знаю ни foo, ни bar, каков шаблон замены?
Я начал писать
sed 's/\(get[A-Z][A-Za-z0-9]*_\)\([A-Z]\)/\1
но я застрял: я хочу написать "2 нижний регистр", как это сделать?
Может быть, sed не адаптирован?
s/\(get[A-Z][A-Za-z0-9]*_\)\([A-Z]\)/\1\L\2/g
Тест:
$ echo 'getFoo_Bar' | sed -e 's/\(get[A-Z][A-Za-z0-9]*_\)\([A-Z]\)/\1\L\2/g'
getFoo_bar
Чтобы изменить getFoo_Bar на getFoo_bar с помощью sed:
echo "getFoo_Bar" | sed 's/^\(.\{7\}\)\(.\)\(.*\)$/\1\l\2\3/'
Верхние и строчные буквы обрабатываются:
\U
Делает весь текст в правом верхнем регистре.\U
делает только первый символ в правом верхнем регистре.\L
Делает весь текст в правом нижнем регистре.\L
Делает только первый символ в правом нижнем регистре. (Запишите его строчную букву L)Пример - это всего лишь один метод сопоставления шаблонов, основанный только на изменении одного фрагмента текста. Используя этот пример, getFoo_BAr преобразуется в getFoo_bAr, обратите внимание, что A не был изменен.
Несколько короче:
echo getFoo_Bar | sed 's/_\(.\)/_\L\1/'
Кратчайший я могу придумать:
echo getFoo_Bar | sed 's/_./\L&/'
Вы можете использовать perl для этого:
perl -pe 's/(get[A-Z][A-Za-z0-9]*)_([A-Z])/\1_\l\2/'
Здесь\l - это трюк.
sed не выполняет верхний/нижний регистр в согласованных группах.
Из FAQ: Как преобразовать строку во все строчные или заглавные буквы?
Если вы хотите написать все в нижнем регистре сразу после подчеркивания, это будет работать для вас:
echo getFoo_Bar | gawk -F_ '{print tolower($2)}'
echo ABCD | sed -r 's/(A)(B)(C)(D)/\1\l\2\3\4/'
echo ABCD | sed -r 's/(A)(B)(C)(D)/\1\L\2\E\3\4/'
Помогите:
\L Turn the replacement to lowercase until a \U or \E is found
\l Turn the next character to lowercase
\U Turn the replacement to uppercase until a \L or \E is found
\u Turn the next character to uppercase
\E Stop case conversion started by \L or \U
echo getFoo_Bar | sed 's/[Bb]/\L&/g'