簡體   English   中英

Bash:用另一組行替換文件中的多個連續行

[英]Bash: replacing multiple consecutive lines in a file with another set of lines

目的是修改一些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[@]或包含相同行的文件中的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實現它。

要修改的規則具有可變的行號和可變的行號,因此以下文章不適用於此處:

不清楚要實現的目標,因此可能正在將數組內容粘貼到文件中。

假設該數組是bash數組,則可以使用以下命令:

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

這將用數組的所有元素覆蓋文件的內容,每行1個元素。

答案其實很簡單:

  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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM