[英]sed- insert text before and after pattern
作为优化的一部分,我正在尝试替换所有包含字符串的 Java 文件:
logger.trace("some trace message");
和:
if (logger.isTraceEnabled())
{
logger.trace("some trace message");
}
注意一些跟踪消息不是确切的字符串,而是一个示例。 这个字符串对于每个实例都是不同的。
我正在使用 bash 脚本和 sed 但不能完全正确地获得命令。
我已经在 bash 脚本中尝试过这个插入之前:
traceStmt="if (logger.isTraceEnabled())
{
"
find . -type f -name '*.java' | xargs sed "s?\(logger\.trace\)\(.*\)?\1${traceStmt}?g"
我也尝试了不同的变体,但没有成功。
使用 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
$
如果您想阻止添加新的行尾
sed
会将\n
添加到不以\n
结尾的文件的末尾)
你可以试试:
perl -pi -e 's/logger.trace\("some trace message"\);/`cat input`/e' file.java
注意结尾/e
评估修饰符
s///e
将eval{...}
包裹在替换字符串周围,评估结果将替换为匹配的 substring。 一些例子:
在本例中,文件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' {} +
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.