![Рефакторинг кода с использованием sed](https://rvso.com/image/76408/%D0%A0%D0%B5%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%BD%D0%B3%20%D0%BA%D0%BE%D0%B4%D0%B0%20%D1%81%20%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC%20sed.png)
Как написать скрипт sed, который переставляет/рефакторит строку символов файла?
Содержимое моего файла:
for(int i=0; i<old(a, 10); i++)
{
sum += old(c*c, i*a)
}
И я хочу, чтобы измененное содержимое выглядело так:
for(int i=0; i<new(10,0,a); i++)
{
sum += new(i*a, c*c)
}
решение1
Следующий код работает с GNU sed
— он использует маркеры границ слов \<
и \>
, чтобы гарантировать, что он изменяется old
на только new
тогда, когда он сам по себе является «словом», а не просто встроен как часть слова, например cold
.
$ sed -e 's/\<old\>/new/g' foo.c
for(int i=0; i<new(a, 10); i++)
{
sum += new(c*c, i*a)
}
Используйте опцию GNU sed, -i
если вы хотите, чтобы файл изменялся на месте, а не выводился на стандартный вывод.
ПРЕДУПРЕЖДЕНИЕ: Этот sed
сценарий изменитсяВСЕвхождения /\<old\>/
в исходном файле. Это может быть гораздо больше, чем вы хотите изменить.
решение2
gnu sed:
/bin/sed -ire \
's!\<old\(([^)]+), *([^) ][^)]*)\)!new(\2, \1)!g' \
*.c </dev/null