ファイル内の一致する最初の行の前に複数行のテキストを挿入します。

ファイル内の一致する最初の行の前に複数行のテキストを挿入します。

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を含む最初の行の前にのみこの3行を設定する必要があります。

例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ファイルで最初の一致が発生すると、3行が印刷されます。次に、その行が再印刷されないようにdoneフラグを設定します。1最後に末尾がある場合、1データのすべての行が印刷されます。

出力の3行の後に空白行が必要な場合は、最後の\n\n文字列の末尾に追加してください。

出力が記録されnewfileawk異常なエラーが発生しない場合、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

関連情報