在文件中第一个匹配行之前插入多行文本

yae*_*ael 3 logs sed awk perl text-processing

我们想在 log4j 文件中添加以下几行

log4j.appender.DRFA=org.apache.log4j.RollingFileAppender
log4j.appender.DRFA.MaxBackupIndex=100
log4j.appender.DRFA.MaxFileSize=10MB
Run Code Online (Sandbox Code Playgroud)

但这些行必须在包含单词 - DatePattern的第一行之前,无论该行是否带有标记

#log4j.appender.DRFA.DatePattern=.yyyy-MM-dd
Run Code Online (Sandbox Code Playgroud)

或者

log4j.appender.DRFA.DatePattern=.yyyy-MM-dd
Run Code Online (Sandbox Code Playgroud)

注意 - 如果 DatePattern 单词出现在文件中几次,那么三行必须只设置在包含 - DatePattern 的第一行之前

示例 1(预期输出)

log4j.appender.DRFA=org.apache.log4j.RollingFileAppender
log4j.appender.DRFA.MaxBackupIndex=100
log4j.appender.DRFA.MaxFileSize=10MB


#log4j.appender.DRFA.DatePattern=.yyyy-MM-dd
Run Code Online (Sandbox Code Playgroud)

示例 2(预期输出)

log4j.appender.DRFA=org.apache.log4j.RollingFileAppender
log4j.appender.DRFA.MaxBackupIndex=100
log4j.appender.DRFA.MaxFileSize=10MB


log4j.appender.DRFA.DatePattern=.yyyy-MM-dd
Run Code Online (Sandbox Code Playgroud)

Kus*_*nda 5

使用awk

awk 'done != 1 && /DatePattern/ {
    print "log4j.appender.DRFA=org.apache.log4j.RollingFileAppender"
    print "log4j.appender.DRFA.MaxBackupIndex=100"
    print "log4j.appender.DRFA.MaxFileSize=10MB"
    done = 1
    } 1' file >newfile && mv newfile file
Run Code Online (Sandbox Code Playgroud)

这将DatePattern在文件中出现第一个匹配项时打印三行。done然后设置标志以1阻止再次打印行。最后的尾随1导致输入数据中的每一行都被打印。

如果您希望在输出中的三行之后出现空行,请添加\n\n到最后一个字符串的末尾。

输出被写入newfile,如果awk没有遇到任何奇怪的错误,一旦awk进程终止,原始错误就会被替换为 this 。


在评论中要求:在匹配的行之后添加行,

awk '1; done != 1 && /DatePattern/ {
    print "log4j.appender.DRFA=org.apache.log4j.RollingFileAppender"
    print "log4j.appender.DRFA.MaxBackupIndex=100"
    print "log4j.appender.DRFA.MaxFileSize=10MB"
    done = 1
    }' file
Run Code Online (Sandbox Code Playgroud)

这会将1( 打印每个输入行并可以由 替换{ print }) 移动到模式匹配时触发的代码之前。