2010-11-09 3 views
0

Например, мой src.tex являетсяКак передавать символы между прописными и строчными буквами с СЭД

SectionType * р = NULL;

и я хочу это изменить, чтобы

section_type * р = NULL;

, что я хочу сделать, это просто изменить SectionType, но остается NULL без изменений, я использовал г/[A-Z]/[A-Z], но это изменит всю строку.

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

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

+0

http://gnuwin32.sourceforge.net/packages/sed.htm –

+0

Ах, я пропустил не GNU часть. Используйте ссылку Игнасио и отправленное мной сообщение, и все должно быть в порядке. –

ответ

1

От here

Преобразовать 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; 
+0

Хм ... это, похоже, попирает 'NULL'. Ищете решение. EDIT: исправлено. добавлено '[a-z]' в первом выражении, чтобы оно игнорировало вещи во всех кепках. –

+0

Я пробовал свой скрипт в MSYS, но по-прежнему не могу работать с моим sed, потому что ваш скрипт использовал ** \ l ** для tansfer первого символа, а мой sed не поддерживает функцию ... – coanor

+0

Я загружаю GNU дистрибутива sed, назовите его как «gsed» и поместите его в ** MSYS/bin **, он хорошо работает с вашим скриптом, и мы можем использовать ** - i ** для перезаписи файла, который мы получили для передачи, сохранения много нажатия клавиши в командной строке. :) в любом случае, мы должны протестировать каждую версию sed, чтобы запустить наш скрипт большую часть времени. Спасибо за советы. :) – coanor

1

Это должно работать без необходимости установки другой версии 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 
+0

В настоящее время я не знаю этих расширенных функций sed, и только 3 дня обучения, я просто получил некоторое регулярное выражение и синтаксис замены, используемые в sed ... но ваш код выглядит замечательно, и я действительно тестирую его в своем sed, так как ваш сказал, работает хорошо, и ... трудно набирать так много символов без ** ctrl + c/v ** .. :) – coanor