Вставляем многострочный текст перед первой подходящей строкой в файл

mint @ mint ~ $ sudo parted -l Модель: ATA ST500LT012-9WS14 (scsi) Диск / dev / sda: 500 ГБ Размер сектора (логический / физический) : 512B / 4096B Таблица разделов: gpt Number Start End Size File system Name Flags 1 1049kB 525MB 524MB fat32 EFI boot system partition 2 525MB 567MB 41.9MB fat32 Основной раздел данных скрыт 3 567 МБ 701 МБ 134 МБ Microsoft зарезервировал раздел msftres 4 701 МБ 1226 МБ 524 МБ ntfs Раздел основных данных скрыт, diag 5 1226 МБ 395 ГБ 394 ГБ ntfs Раздел основных данных msftdata {{ 1}} 8 395 ГБ 395 ГБ 1049 КБ для загрузки fat32 9 395 ГБ 421 ГБ 26,0 ГБ для загрузки ext4 10 421 ГБ 487 ГБ 65,3 ГБ ext4 6 487 ГБ 487 ГБ 473 МБ ntfs скрыто, диаг 7 487 ГБ 500 ГБ 13,0 ГБ ntfs Раздел восстановления Microsoft скрыт, диаг

Модель: ATA LITEONIT LMT-32L (scsi) Диск / dev / sdb: 32,0 ГБ Размер сектора (логический / физический): 512B / 512B Таблица разделов: gpt Number Start End Size File system Name Flags 1 1049kB 8589MB 8588MB Раздел с основными данными 2 8589MB 96 13 МБ 1024 МБ linux-swap (v1) 3 9614 МБ 22,1 ГБ 12,5 ГБ fat32 msftdata Предупреждение: невозможно открыть / dev / sr0 для чтения и записи (файловая система только для чтения). / dev / sr0 открыт только для чтения. Ошибка: не может быть раздела вне диска!

3
05.08.2018, 21:18
5 ответов

Использование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 }), перед кодом, который запускается при совпадении шаблона.

5
27.01.2020, 21:08

Если я правильно понял ваш вопрос, вы просто хотите заменить эту строку:

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
4
27.01.2020, 21:08

Это задание хорошо -подходит для ed, стандартного редактора файлов:

/DatePattern/i
log4j.appender.DRFA=org.apache.log4j.RollingFileAppender
log4j.appender.DRFA.MaxBackupIndex=100
log4j.appender.DRFA.MaxFileSize=10MB
.
wq
1
27.01.2020, 21:08

Используя 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
27.01.2020, 21:08

Так как вы также пометили этот запрос тегом perl, то вот один очевидный способ:

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в отдельной строке. Обратная косая черта heredoc необходима, чтобы какие-либо переменные не были расширены.

Если вы не уверены в указанных выше ограничениях в тексте для добавления, то сделайте это:

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
27.01.2020, 21:08

Теги

Похожие вопросы