繁体   English   中英

sed- 在模式前后插入文本

[英]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///eeval{...}包裹在替换字符串周围,评估结果将替换为匹配的 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM