sed: удалить все совпадения в файле и вставить несколько строк, где первое совпадение было

paste <(cut -f 1-8 file) <(cut -f9- file | tr -d '\t')
3
04.02.2017, 20:14
2 ответа

Если у вас есть новый список серверов в файле с именем list.txt в cwd :

sed '/^server/{x;//!r list.txt
d}' /etc/ntp.conf

или, если вы не хотите использовать файл, а скорее жестко закодируете новые имена серверов:

sed '/^server/{x;//!c\
server 1\
........\
server n-1\
server n
d}' /etc/ntp.conf

Предполагается, что существует по крайней мере одна не комментируемая строка сервера в вашем /etc/ntp.conf (также он не удалит какие-либо закомментированные строки server - вы можете изменить регулярное выражение, чтобы включить их тоже). Если вы хотите вставить эти строки, даже если в исходном файле не было записей о сервере (и в этом случае добавьте новые серверы в конец файла), вы можете сделать что-то вроде:

sed '/^server/{x;//!r list.txt
d}
${x;//!r list.txt
x}' /etc/ntp.conf

или использовать те же условия, если вы предпочитаете using c \ - я оставлю это как упражнение. Имейте в виду, что при изменении строк с помощью c \ все обратные косые черты и встроенные символы новой строки должны быть экранированы обратной косой чертой (как в моем примере).

0
27.01.2020, 21:37
sed '
/^server/ d
/first block/a\
server 5.5.5.5\
server 6.6.6.6\
server 7.7.7.7
' /etc/ntp.conf

изменить только первое вхождение:

# first block occurrences
server 5.5.5.5
server 6.6.6.6
server 7.7.7.7

driftfile /var/lib/ntp/drift

# second block of occurrences
0
27.01.2020, 21:37

Теги

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