![在文件中第一个匹配行之前插入多行文本](https://linux22.com/image/138171/%E5%9C%A8%E6%96%87%E4%BB%B6%E4%B8%AD%E7%AC%AC%E4%B8%80%E4%B8%AA%E5%8C%B9%E9%85%8D%E8%A1%8C%E4%B9%8B%E5%89%8D%E6%8F%92%E5%85%A5%E5%A4%9A%E8%A1%8C%E6%96%87%E6%9C%AC.png)
我们要在 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