web-dev-qa-db-ja.com

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

log4jファイルに次の行を追加します

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

ただし、これらの行は、Wordを含む最初の行の前にある必要があります-DatePattern、行がマーク付きかどうかに関係なく

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

または

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

注-DatePatternWordがファイルに数回表示される場合は、次の3行のみを最初の行の前に設定する必要があります-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
3
yael

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行が出力されます。次に、フラグdone1に設定され、行の再印刷が停止されます。末尾に1が続くと、データ内のすべての行が印刷されます。

3行の後に出力に空の行が必要な場合は、最後の文字列の最後に\n\nを追加します。

出力はnewfileに書き込まれ、awkで奇妙なエラーが発生しなかった場合、awkプロセスが終了すると、元のエラーがこれに置き換えられます。


コメントで要求:行の追加after一致した行、

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 }に置き換えることができます)を、パターンが一致したときにトリガーされるコードの前に移動します。

5
Kusalananda

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
Rakesh Sharma

このクエリにもPerlのタグを付けたので、次の1つの明白な方法があります。

Perl -pi -e '
     print <<\EOF if /DatePattern/ && !$seen++;
log4j.appender.DRFA=org.Apache.log4j.RollingFileAppender
log4j.appender.DRFA.MaxBackupIndex=100
log4j.appender.DRFA.MaxFileSize=10MB
EOF
' input.file

注:追加されたテキストには、単独の行にスタンドアロンの文字列EOFを含めないでください。ヒアドキュメントのバックスラッシュは、変数が展開されないようにするために必要です。

追加するテキストで上記の制約がわからない場合は、次のようにします。

Perl -pi -e '
    next if !/DatePattern/ || $seen++;
    open my $fh, "<", "file2add.txt" or die "Could not open file for reading:$!\n";
    $_ = join "", <$fh>, $_;
' input.file
2
Rakesh Sharma

これは、標準のファイルエディタであるedに適したジョブです。

/DatePattern/i
log4j.appender.DRFA=org.Apache.log4j.RollingFileAppender
log4j.appender.DRFA.MaxBackupIndex=100
log4j.appender.DRFA.MaxFileSize=10MB
.
wq
1
Toby Speight