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
открыт только для чтения.
Ошибка: не может быть раздела вне диска!
Использование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 }
), перед кодом, который запускается при совпадении шаблона.
Если я правильно понял ваш вопрос, вы просто хотите заменить эту строку:
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
Это задание хорошо -подходит для ed
, стандартного редактора файлов:
/DatePattern/i
log4j.appender.DRFA=org.apache.log4j.RollingFileAppender
log4j.appender.DRFA.MaxBackupIndex=100
log4j.appender.DRFA.MaxFileSize=10MB
.
wq
Используя 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
.
Так как вы также пометили этот запрос тегом 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