【问题标题】:Bash: replacing multiple consecutive lines in a file with another set of linesBash:用另一组行替换文件中的多个连续行
【发布时间】:2019-07-19 23:08:24
【问题描述】:

目标是修改 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 来实现。

要修改的规则行数不定,行号不定,所以下面的帖子在这里不适用:

【问题讨论】:

  • online_ipv4_user_input_rules[@]的内容是什么,你想如何将文件rules.v4的内容与数组online_ipv4_user_input_rules[@]的内容匹配?
  • online_ipv4_user_input_rules[@] 只是另一组不同的规则:-A ufw-user-input -s aaaa/27 -j ufw-logging-input -A ufw-user-input -s bbbb/ 28 -j ufw-logging-input -A ufw-user-input -s cccc/29 -j ufw-logging-input
  • a.a.a.ax.x.x.x之间有什么关系吗?如果是,请更新您的问题。如果没有,为什么不直接打印数组的内容?
  • 没有。这是无关紧要的。它们的内容和规则/行数会随着时间而变化。

标签: bash awk sed replace


【解决方案1】:

不太清楚你想要实现什么,所以也许将数组的内容粘贴到文件中就是你正在查看的内容。

假设数组是bash数组,你可以这样使用:

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

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

【讨论】:

    【解决方案2】:

    其实答案很简单:

    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

    【讨论】:

      猜你喜欢
      • 2016-11-20
      • 2021-01-28
      • 2019-07-26
      • 2021-04-27
      • 1970-01-01
      • 2014-02-03
      • 2012-08-25
      • 2012-10-22
      相关资源
      最近更新 更多