Text-Processing
在文件中的第一個匹配行之前插入多行文本
我們想在 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
這個 GNU
sed
命令可以做到這一點:$ 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 }
)移動到模式匹配時觸發的程式碼之前。