sed- вставить текст до и после шаблона - PullRequest
0 голосов
/ 13 июля 2020

В рамках оптимизации я пытаюсь заменить все Java файлы, содержащие строку:

logger.trace("some trace message");

на:

if (logger.isTraceEnabled())
{
  logger.trace("some trace message");
}

NB. Некоторое сообщение трассировки не является точная строка, но пример. Эта строка будет отличаться для каждого экземпляра.

Я использую bash скрипт и sed, но не могу правильно понять команду.

Я пробовал это в bash сценарий для вставки перед:

traceStmt="if (logger.isTraceEnabled())
{
  "
find . -type f -name '*.java' | xargs sed "s?\(logger\.trace\)\(.*\)?\1${traceStmt}?g"

Я также пробовал разные варианты, но безуспешно.

Ответы [ 2 ]

1 голос
/ 13 июля 2020

Попробуйте следующее, используя GNU sed:

$ cat file1.java
1
2
logger.trace("some trace message");
4
5

$ find . -type f -name '*.java' | xargs sed 's?\(logger\.trace\)\(.*\)?if (logger.isTraceEnabled())\n{\n    \1\2\n}?'
1
2
if (logger.isTraceEnabled())
{
    logger.trace("some trace message");
}
4
5
$
0 голосов
/ 13 июля 2020

Если вы хотите предотвратить добавление новых окончаний строк,

sed добавит \n в конец файлов, которые не заканчиваются на \n)

Вы можете попробовать:

perl -pi -e 's/logger.trace\("some trace message"\);/`cat input`/e' file.java

обратите внимание на окончание /e

Модификатор оценки s///e оборачивает eval{...} вокруг строки замены и оцениваемой Результат заменяется на совпавшую подстроку. Некоторые примеры:

В этом случае из вашего примера файл input содержит:

if (logger.isTraceEnabled())
{
  logger.trace("some trace message");
}

Если у вас несколько файлов, вы можете попробовать:

find . -type f -name '*.java' -exec perl -pi -e 's/logger.trace\("some trace message"\);/`cat input`/e' {} +
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...