Linux / Bash: комментируйте каждую строку, соответствующую шаблону

4

sedчуждо мне, мягко говоря. Я хотел бы просмотреть дерево проекта C и закомментировать каждую строку, вызывающую функцию LogMsg(). Что-то, что могло бы достичь следующего:

foreach: line within *.c
  if: line contains "LogMsg"
    prepend "//"

Или так. Кроме того, я хотел бы посмотреть, смогу ли я добиться обратного, хотя я представляю, что это может быть более трудным.

Я чувствую, что sedэто правильный инструмент для этой работы, но я не эксперт в пакетном редактировании текстовых файлов. Любая помощь?

musasabi
источник

Ответы:

7

Команда для использования:

 sed '/LogMsg/ s?^?//?' filename  new_filename

Он находит строки в имени файла файла , содержащего LogMsg , и заменяет в начале строки ( ^ ) двойную косую черту. Знак вопроса используется в качестве разделителя вместо обычного слеша, чтобы избежать путаницы с заменяемым текстом. Вывод перенаправляется в новую версию файла вместо стандартного вывода.

MariusMatutiae
источник
Большое спасибо. Это было сжато и правильно. Есть ли подобная команда, которая просто удаляет слэши комментариев, если они появляются в строке с LogMsg ()?
musasabi
s? противоположность s ^ Я так понимаю?
musasabi
@musasabi Нет. Знак вопроса - это просто разделитель. Строка, начинающаяся с s, означает: заменить // ничем. ? идентифицирует, где строка, которая будет заменена, и ее замена, начало и конец. И да, лучший обратный вариант (забудьте про приведенное выше: sed 'LogMsg / s? ^ //? ^?' Filename> new_filename. Шляпа ^ указывает начало строки, знак доллара $ указывает конец строки.
MariusMatutiae