Сопоставить шаблон внутри блока текста, ограниченного двумя различными шаблонами - PullRequest
2 голосов
/ 21 октября 2019

Есть ли способ сопоставить шаблон в блоке текста, границы которого представляют собой два уникальных шаблона в разных строках? Под этим я подразумеваю:

/*some comment*/
void something_patternWord1()
{
   some_code;
   some_code;
   some_code_patternWord3;
   some_code;
}
/*some comment patternWord2

Желаемый результат:

/*some comment*/
void something_patternWord1()
{
   some_code;
   some_code;
   new_line_of_some_code;   //after performing sed command
   some_code_patternWord3;
   some_code;
}
/*some comment patternWord2

Что я пробовал:

sed '/patternWord1/,/patternWord2/{/patternWord3/i new_line_of_some_code;}' inputFile > outputFile

Приведенная выше команда не работает.

В конечном счете, я пытаюсь добиться использования скрипта bash, чтения некоторых файлов из файла .csv, и если слово для чтения имеет значение someWord, тогда поиск ограниченного блока текстана patternWord1 и patternWord2, сопоставьте patternWord3 в этом блоке текста и вставьте некоторый код над ним.

У меня много .cpp файлов с множеством различных функций и, следовательно, много комбинаций разных patternWord1 и patternWord2.

Возможно ли то, что я пытаюсь сделать, с помощью sed, и является ли sed лучшим инструментом для чего-то подобного?

Возможно, другой подход:Можно ли будет использовать операторы if-then в bash при чтении сценария в файле .cpp, а , а затем использовать команду sed, чтобы сопоставить patternWord3 и вставитьновая строка кода?

Если бы вы могли помочь мне с sed, это было бы здорово, но я также открыт для других предложений, если это имеет больше смысла / это более эффективно. Заранее спасибо.

1 Ответ

1 голос
/ 21 октября 2019

Смысл в том, чтобы указать команде вставки, где остановиться.

Вы можете сделать это несколькими способами, либо поместив вставленную строку в новую строку, либо закрыв команду sed с помощью 'где вставленная строка должна заканчиваться.

Вы можете использовать

sed -e '/patternWord1/,/patternWord2/{/patternWord3/i\
   new_line_of_some_code;
}'

Или

sed -e '/patternWord1/,/patternWord2/{/patternWord3/i \ \ \ new_line_of_some_code;' -e '}' inputFile > outputFile

См. онлайн-демонстрацию :

s='/*some comment*/
void something_patternWord1()
{
   some_code;
   some_code;
   some_code_patternWord3;
   some_code;
}
/*some comment patternWord2'

sed -e '/patternWord1/,/patternWord2/{/patternWord3/i \ \ \ new_line_of_some_code;' -e '}' <<< "$s"

Вывод:

/*some comment*/
void something_patternWord1()
{
   some_code;
   some_code;
   new_line_of_some_code;
   some_code_patternWord3;
   some_code;
}
/*some comment patternWord2
...