Bash: замена нескольких последовательных строк в файле другим набором строк - PullRequest
0 голосов
/ 26 февраля 2019

Цель состоит в том, чтобы изменить некоторые последовательные правила в файле iptables, добавив несколько новых правил, собранных в массив bash (который может быть сохранен во временный файл при необходимости).

Правила для изменения в rules.v4:

-A ufw-user-input -s <ip_address_1>/<mask_1> -j ufw-logging-input
-A ufw-user-input -s <ip_address_2>/<mask_2> -j ufw-logging-input
-A ufw-user-input -s <ip_address_3>/<mask_3> -j ufw-logging-input

Эти строки могут быть сопоставлены с: -A ufw-user-input -s [0-9./]+ -j ufw-logging-input или могут быть доступны в массиве iptables_ipv4_user_input_rules[@]

Все они должны быть заменены в файле iptables rules.v4содержимым другого массива, содержащего другой набор переменного числа правил: online_ipv4_user_input_rules[@] или из файла, содержащего те же строки:

-A ufw-user-input -s <ip_address_4>/<mask_4> -j ufw-logging-input
-A ufw-user-input -s <ip_address_5>/<mask_5> -j ufw-logging-input
-A ufw-user-input -s <ip_address_6>/<mask_6> -j ufw-logging-input
-A ufw-user-input -s <ip_address_7>/<mask_7> -j ufw-logging-input

Я понятия не имею, как реализовать это с помощью sed или awk.

Изменяемые правила содержат переменное количество строк с переменными номерами строк, поэтому следующий пост здесь не применяется:

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

Ответ довольно прост на самом деле:

  1. Удаление первого набора правил из rules.v4

    sed -Ei '/-A ufw-user-input -s [0-9./]+ -j ufw-logging-input/d' rules.v4

  2. Вставка второго набора правил (ранее сохраненного в rules.tmp) после правой строки в rules.v4:

    sed -i '/-A ufw-skip-to-policy-output -j DROP/r rules.tmp' rules.v4

0 голосов
/ 26 февраля 2019

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

Предполагая, что массив представляет собой массив bash, вы можетеиспользуйте это:

printf "%s\n" "${online_ipv4_user_input_rules[@]}" > rules.v4

Это перезапишет содержимое файла со всеми элементами массива, по 1 элементу в строке.

...