Text-Processing

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

  • August 7, 2018

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

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

但是這些行必須在包含單詞DatePattern的第一行之前,並且無論該行是否帶有標記

#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

如果我正確理解您的問題,您只想替換此行:

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

關於行的複制。您不會將這個附加程序定義超過 1 次:

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

使用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 })移動到模式匹配時觸發的程式碼之前。

引用自:https://unix.stackexchange.com/questions/460684