2015-03-25 2 views
-3

У меня есть такая задача, но я понятия не имею, как написать ее с помощью функции sed. я должен изменить способ комментирования в файле с:Функция Sed (Bash) - Изменение способа прокомментированных строк

//something6 
//something4 
//something5 
//something3 
//something2 

в

/*something6 
* something4 
* something5 
* something3 
* something2*/ 

из

//something6 
//something4 
//something5 
//something3 
//something2 

в

/*something6 
something4 
something5 
something3 
something2*/ 

из

/*something6 
* something4 
* something5 
* something3 
* something2*/ 

в

//something6 
//something4 
//something5 
//something3 
//something2 

из

/*something6 
something4 
something5 
something3 
something2*/ 

в

//something6 
//something4 
//something5 
//something3 
//something2 

Эти 4 модели должны быть сделаны SED функцией (я предполагаю, но не уверен в этом). Пробовал делать это, но без везения. Я могу заменить отдельные слова на другие, но как изменить способ комментирования? Нет подсказки. Было бы очень благодарно за помощь и помощь.

+0

Что вы имеете в виду? – Darth

+0

Я голосую, чтобы закрыть этот вопрос как не по теме, потому что он не показывает усилий поиска. –

+0

Такая вещь, как правило, немного сложна, потому что вы переходите от линейного комментария к разделительному. Сначала нужно извлечь комментарий, а затем снова вставить его. Например, как бы вы справились: 'something_not_comment // some comment' – Sobrique

ответ

0

Учитывая, что задача:

Пожалуйста, напишите сценарий, который позволяет изменять стиль комментариев в исходных файлах, например: /* .... */ идет к // .... Стиль комментария - это аргумент скрипта.

Я пытался использовать только типична:

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, чтобы использовать % вместо / в качестве разделителя. Есть три операции в рамках внешней группировки { ... }:

  1. Преобразовать /*anything в //anything и начать на следующей строке.
  2. Конвертировать anything*/ в //anything и начать со следующей строки.
  3. Преобразуйте любую другую линию так, чтобы она сохраняла заготовки, но ставит // после них.

Это до сих пор смешно легко подорвать, если комментарии злобно сформированы. Например:

/* 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.

Смежные вопросы