Insert multiline text before the first matching line in a file

awklogsperlsedtext processing

we want to add the following lines in log4j file

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

but these lines must be before the first line that include the word – DatePattern , and no matter if line is with mark or not

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

or

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

note – in case DatePattern word apears couple times in file , then the three lines must be set only before the first line that include – DatePattern

example 1 ( expected output )

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


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

example 2 ( expected output )

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


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

Best Answer

If I understand your question correctly you merely want to replace this line:

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

With these lines:

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

This GNU sed command can do this:

$ 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

With respect to the duplicating of lines. You're not going to have this appender defined more than 1 time:

appender.DRFA.DatePattern

Therefore we can look more explicitly for this occurrence, rather than the DatePattern line that you're looking for.

Example run

Here's a sample file that has just this line in it:

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

Run the sed command above against this file:

$ 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