Как перенести символы между прописными и строчными буквами с помощью sed - PullRequest
0 голосов
/ 09 ноября 2010

Например, мой src.tex имеет значение

SectionType * p = NULL;

, и я хочу изменить его на

section_type * p = NULL;

я хочу просто изменить SectionType , но оставить NULL без изменений, я использовал y/ [AZ] / [az] , но это изменит всю строку.

Мой sed не поддерживает функции \ L, \ l, \ U и \ u, версия - 3. *и распространяется под FSF, а не GNU, может быть, GNU хорошо работает с этими функциями, но в то время я не мог принять GNU, потому что я работаю в msys и нет пакета GNU.

Есть лирешение получить?

Ответы [ 2 ]

1 голос
/ 09 ноября 2010

Это должно работать без установки другой версии sed. Изменяет регистр только в первом слове строки.

upper=$(printf "%s" {A..Z})
lower=$(printf "%s" {a..z})
sed "s/ /\n/;h;s/[^\n]*\n//;x;s/\n.*//;y/$upper/$lower/;G;s/\n//" inputfile

Моя версия sed не подойдет y/[A-Z]/[a-z]/, для нее требуется явное включение каждого символа, поэтому я использовал переменные. То, как я их создал, зависит от функции, которая есть только в некоторых оболочках, таких как Bash и ksh. Вы можете сделать простое назначение или использовать диапазон, если ваш sed поддерживает его.

Если ваша версия sed действительно требовательна, она может потребовать -e вместо точек с запятой. Эта версия должна работать в этом случае:

sed -e "s/ /\n/" -e "h" -e "s/[^\n]*\n//" -e "x" -e "s/\n.*//" -e "y/$upper/$lower/" -e "G" -e "s/\n//" inputfile
1 голос
/ 09 ноября 2010

С здесь

Конвертировать CamelCase или camelCase в camel_case:

sed -e 's/\([A-Z][a-z]\)/_\l\1/g' -e 's/^_\([a-z]\)/\1/g' file.txt

Ввод:

SectionType *p = NULL;
sectionType *p = NULL;
ABCSectionType *p = NULL;

Выход:

section_type *p = NULL;
section_type *p = NULL;
ABC_section_type *p = NULL;
...