Учитывая, что задача:
Пожалуйста, напишите сценарий, который позволяет изменять стиль комментариев в исходных файлах, например: /* .... */
идет к // ...
. Стиль комментария - это аргумент скрипта.
Я пытался использовать только типична:
sed -i 's/'"$lookingfor"'/'"$changing"'/g' $filename
В этом контексте, либо $lookingfor
или $changing
или оба будут содержать косую черту, так что простая формулировка не работает, как вы правильно наблюдать.
Конверсия //
комментариев к /*
комментариям легко, как долго, как вы знаете, что вы можете выбрать любой символ, чтобы отделить участки команды s///
, такие как %
. Так, например, вы можете использовать:
sed -i.bak -e 's%// *\(.*\)%/*\1 */%'
Это выглядит для двойной косой черты ноль или более пробелов и ничего, и преобразует его в /* anything */
.
Преобразование /*
комментариев намного сложнее.Есть два случая, чтобы быть обеспокоены:
/* A single line comment */
/*
** A multiline comment
*/
Это, прежде чем попасть в:
/* OK */ "/* OK */" /* Really?! */
который представляет собой одну строку, содержащую два комментария и строку, содержащую текст, который снаружи строка будет выглядеть комментарий. Это я старательно игнорирую! Или, точнее, я прилежно, решив, что это будет хорошо, когда преобразуются в:
// OK */ "/* OK */" /* Really?!
, который не является тем же самым на всех, но поделом для написания запутанного C в первую очередь.
Вы можете иметь дело с первым случаем что-то вроде:
sed -e '\%/\*\(.*\)\*/% { s%%//\1%; n; }'
Я имею группирование скобки и n
команды там так, что отдельные комментарии линии также не соответствуют второму случаю:
-e '\%/\*%,\%\*/% {
\%/\*% { s%/\*\(.*\)%//\1%; n; }
\%\*/% { s%\(.*\)\*/%//\1%; n; }
s%^\(*\)%\1//%
}'
Первая строка выбирает диапазон строк между одним совпадением /*
и следующим соответствием */
. \%
сообщает sed
, чтобы использовать %
вместо /
в качестве разделителя. Есть три операции в рамках внешней группировки {
... }
:
- Преобразовать
/*anything
в //anything
и начать на следующей строке.
- Конвертировать
anything*/
в //anything
и начать со следующей строки.
- Преобразуйте любую другую линию так, чтобы она сохраняла заготовки, но ставит
//
после них.
Это до сих пор смешно легко подорвать, если комментарии злобно сформированы. Например:
/* a comment */ int x = 0;
сопоставляется:
// комментария междунар х = 0;
Устранение подобных проблем и пример со строкой - это то, что я даже не начал пробовать в sed
. И это, прежде чем попасть на юридические, но неправдоподобных комментарии C, как: (! Но содержит два комментария)
/\
\
* comment
*\
\
/
/\
/\
noisiness \
commentary \
continued
, который содержит только два замечания. И прежде чем вы решите иметь дело с триграфами (??/
- это обратная косая черта). Etc.
Таким образом, умеренное приближение к C Замечанию преобразования C++ является:
sed -e '\%/\*\(.*\)\*/% { s%%//\1%; n; }' \
-e '\%/\*%,\%\*/% {
\%/\*% { s%/\*\(.*\)%//\1%; n; }
\%\*/% { s%\(.*\)\*/%//\1%; n; }
s%^\(*\)%\1//%
}' \
-i.bak "[email protected]"
Я предполагаю, что вы не используете C оболочки; Если это так, вам нужно больше обратных косых черт на концах строк в скрипте, чтобы обработать многострочную одноколейную команду sed
.
Что вы имеете в виду? – Darth
Я голосую, чтобы закрыть этот вопрос как не по теме, потому что он не показывает усилий поиска. –
Такая вещь, как правило, немного сложна, потому что вы переходите от линейного комментария к разделительному. Сначала нужно извлечь комментарий, а затем снова вставить его. Например, как бы вы справились: 'something_not_comment // some comment' – Sobrique