Следующий сценарий sed должен это делать:
s/\(#include\) *\([^ ]\+\)/\1 \2/
/^#include "/ {
s/".*\//"/
s/"\(.\)/"\l\1/g
s/\([^A-Z]\)\([A-Z]\)/\1_\l\2/g
s/_\+/_/g
}
Это можно применить к файлам, запустив:
sed -i.bak -f fix.sed input...
(Предполагается, что приведенный выше сценарий называется fix.sed
, а любой { Впоследствии в качестве аргументов можно указать количество файлов {1}}. Удалите .bak
, если вы не хотите создавать резервные копии.)
Первое выражение замены sed соответствует #include
с последующим
, возможно, пустым пробелом ( \ *
), и заменяет этот пробег одним пробелом
. Он также переводит остальную часть строки ( [^] \ +
) в
нижний регистр (используя \ l
).
Следующие четыре выражения sed, все из которых применяются только к строкам, которые
начинаются с #include "
, делают следующее:
Удаляют имя пути (все, включая последняя косая черта);
переводит первый символ между кавычками в нижний регистр;
в начале каждого ряда заглавных букв вставляет подчеркивание и переводит первый символ бега в нижний регистр;
сжатие пробежки подчеркивания, возможно, вставленные на предыдущих шагах.
Это несовершенно, но переводит ваш образец ввода должным образом.