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

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

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

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

但这些行必须位于包含单词 - 的第一行之前日期模式,并且无论线是否带有标记

#log4j.appender.DRFA.DatePattern=.yyyy-MM-dd

或者

log4j.appender.DRFA.DatePattern=.yyyy-MM-dd

注意 - 如果 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

示例 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

答案1

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

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

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

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


评论中要求:添加行匹配的线,

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

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

答案2

如果我正确理解你的问题,你只想替换这一行:

log4j.appender.DRFA.DatePattern=.yyyy-MM-dd
-or-
#log4j.appender.DRFA.DatePattern=.yyyy-MM-dd

用这些行:

log4j.appender.DRFA=org.apache.log4j.RollingFileAppender
log4j.appender.DRFA.MaxBackupIndex=100
log4j.appender.DRFA.MaxFileSize=10MB
log4j.appender.DRFA.DatePattern=.yyyy-MM-dd
-or-
#log4j.appender.DRFA.DatePattern=.yyyy-MM-dd

这个 GNUsed命令可以做到这一点:

$ sed -i 's/\(.*appender.DRFA.DatePattern=.*\)/log4j.appender.DRFA=org.apache.log4j.RollingFileAppender\nlog4j.appender.DRFA.MaxBackupIndex=100\nlog4j.appender.DRFA.MaxFileSize=10MB\n\n\n\1/' log4j.properties

关于线条的复制。您不会多次定义此附加程序:

appender.DRFA.DatePattern

因此,我们可以更明确地查找此事件,而不是DatePattern您正在查找的行。

运行示例

这是一个示例文件,其中只有这一行:

$ cat log4j.properties
#log4j.appender.DRFA.DatePattern=.yyyy-MM-dd

sed针对该文件运行上面的命令:

$ cat log4j.properties
log4j.appender.DRFA=org.apache.log4j.RollingFileAppender
log4j.appender.DRFA.MaxBackupIndex=100
log4j.appender.DRFA.MaxFileSize=10MB
#log4j.appender.DRFA.DatePattern=.yyyy-MM-dd

答案3

使用GNU sed你也可以这样处理它:

sed -i -e '
    /DatePattern/!b

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

    :a;n;$!ba
' input.file

如果您确定不能DatePattern位于文件的最后一行,那么您也可以这样做:

sed -i -e '
    /DatePattern/!b
    r file2add.txt
    N;:a;n;$!ba
' input.file

将所有要添加到文件中的行放在其中,例如file2add.txt.注意:使用此方法,您不会在文件中添加尾部反斜杠file2add.txt

答案4

这是一个非常适合ed标准文件编辑器的工作:

/DatePattern/i
log4j.appender.DRFA=org.apache.log4j.RollingFileAppender
log4j.appender.DRFA.MaxBackupIndex=100
log4j.appender.DRFA.MaxFileSize=10MB
.
wq

相关内容