Bash:用另一组行替换文件中的多个连续行

时间:2019-02-26 11:53:21

标签: bash awk sed replace

目标是修改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 :(得分:0)

不清楚要实现的目标,所以也许您正在查看将数组内容粘贴到文件中。

假设该数组是bash数组,则可以使用以下方法:

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

这将使用数组的所有元素(每行1个元素)覆盖文件的内容。

答案 1 :(得分:0)

答案很简单:

  1. 从rules.v4中删除第一组规则

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

  2. 在右行之后插入第二组规则(以前保存到rules.tmp中):v4:

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