Как заменить ВЕСЬ текст в файле после определенной строки содержимым другого текстового файла с помощью sed/awk?

Сетевой интерфейс всегда поддерживается некоторым модулем ядра или аналогичной частью ядра, которая представляет что-то , будь то физический интерфейс или некий виртуальный интерфейс, который каким-то образом общается с другими интерфейсами. Есть также интерфейс dummy, который ничего не делает; вы можете назначить им IP-адрес, но, скорее всего, это не даст того, чего вы хотите добиться.

Как правило, вы можете добавлять новые интерфейсы с помощью варианта ip link add... type.... Подробности и список типов см. в man ip-link.

Вы также можете добавить несколько IP-адресов к одному интерфейсу. С ipвам больше не нужны eth0:1и т. д. из ifconfig.

Я подозреваю, что это XY -вопрос , если вы расскажете нам, чего вы на самом деле хотите достичь, и для чего вам нужен второй IP-адрес, будет легче ответить.

8
30.03.2020, 16:34
7 ответов

Печатать все строки до тех пор, пока не будет найдена строка «заменить после», затем прочитать из другого файла и выйти:

sed '/^### REPLACE EVERYTHING AFTER THIS LINE ###$/{r replacement_file.txt
q;}' original_file.txt

  • используйте sed -iдля сохранения изменений
  • или... > tmp && mv tmp original
14
19.03.2021, 02:31

В GNU/awk:

Назовите два файла в качестве аргументов.

awk '{ print; } /^### REPLACE EVERYTHING AFTER THIS LINE ###$/ { nextfile; }' fn1 fn2
15
19.03.2021, 02:31

Это будет эффективно работать с любым awk и cat:

$ awk '{print} /### REPLACE EVERYTHING AFTER THIS LINE ###/{exit}' original_file.txt &&
    cat replacement_file.txt
common_text
### REPLACE EVERYTHING AFTER THIS LINE ###
testing123
this_is_the_replacement_text

Как и в случае с любыми инструментами UNIX, для обновления оригинала просто запишите вывод во временный файл, а затем замените оригинал этим временным файлом:

{ awk '{print} /### REPLACE EVERYTHING AFTER THIS LINE ###/{exit}' original_file.txt &&
   cat replacement_file.txt; } > tmp && mv tmp original_file.txt
6
19.03.2021, 02:31

при использовании gnu Awk:

awk '{print} /### REPLACE.../{system("cat replacement"); exit 0}' file
3
19.03.2021, 02:31

Если вы хотите отредактировать файл, отдайте предпочтение edвместоsed:

ed -s original_file.txt <<'EOF'
/^### REPLACE/+1,$d
r replacement_file.txt
w
EOF

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

3
19.03.2021, 02:31

Проверено, работает нормально

Команда

sed  -ni -e   '1,/#/p' -e '/#/r replacement_file.txt'  titled original_file.txt

выход

common_text
### REPLACE EVERYTHING AFTER THIS LINE ###
testing123
this_is_the_replacement_text
0
19.03.2021, 02:31

Использованиеsed:

sed -n -e '1,/^### REPLACE EVERYTHING AFTER THIS LINE ###$/{ p; d; }' \
       -e 'r replacement_file.txt' \
       -e 'q' original_file.txt

Три sedблока делают это:

  1. Первый блок печатает все строки от строки 1 до строки со специальным содержимым. Я печатаю эти строки явно с помощью p, а затем вызываю d, чтобы принудительно запустить новый цикл ("print; next" вawk).
  2. После того, как начальные строки были выведены первым блоком, второй блок выводит содержимое дополнительного файла.
  3. После этого сценарий редактирования завершается.

Обычно qв третьем блоке выводит текущую строку перед выходом (это будет строка в примере чтения данных text_that_will), но так как sedвызывается с -n, это значение по умолчанию вывод строки в конце цикла запрещен.

Результат приведенной выше команды с учетом ваших данных:

common_text
### REPLACE EVERYTHING AFTER THIS LINE ###
testing123
this_is_the_replacement_text

Чтобы обновить исходный файл, вы можете использовать sed -i...или перенаправить вывод в новый файл, который затем заменит исходный на :

.
sed... original_file.txt >original_file.txt.new &&
mv original_file.txt.new original_file.txt
7
19.03.2021, 02:31

Теги

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