【问题标题】:sed- insert text before and after patternsed - 在模式前后插入文本
【发布时间】:2020-07-14 00:49:41
【问题描述】:

作为优化的一部分,我正在尝试替换所有包含该字符串的 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"

我也尝试了不同的变体,但没有成功。

【问题讨论】:

    标签: linux bash sed


    【解决方案1】:

    使用 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
    $
    

    【讨论】:

    • 控制台输出显示更改,但文件没有更改。
    • @karen。对sed 使用-i 选项进行原位替换,即`find . -type f -name '*.java' | xargs sed -i 's?(logger\.trace)(.*)?if (logger.isTraceEnabled())\n{\n \1\2\n}?'
    【解决方案2】:

    如果您想阻止添加新的行尾

    sed 会将\n 添加到不以\n 结尾的文件的末尾)

    你可以试试:

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

    注意结尾/e

    评估修饰符s///eeval{...} 包裹在替换字符串周围,评估结果将替换匹配的子字符串。一些例子:

    在您的示例中,文件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' {} +
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-11-13
      • 2013-08-22
      • 2021-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多