我对 UNIX 还很陌生。
我正在尝试用 替换maxretry = *
fail2ban 配置文件maxtretry = 3
,以便每个包最多有三次重试机会,直到 IP 被阻止。
我知道关于有很多问题sed
,但我没有找到任何可以回答我的问题。
我知道的sed
情况如下:
sed -i 's/old-word/new-word/g' /etc/fail2ban/config.local
(我忘记了本地配置文件的名称)
sed
功能强大,但我不太理解。它用正则表达式替换字符串,但创建正则表达式对我来说相当困难。
我试过:
sed -i 's/"maxretry = *"/"maxretry = 3"/g' /etc/fail2ban/config.local
正如我所料,什么都没有改变。
有人能帮我理解一下吗sed
?特别是用 * 这样的占位符来表示任何类型的数字。
答案1
你可以做:
sed -Ei.bak 's/^([[:blank:]]*maxretry[[:blank:]]*=).*/\1 3/' /etc/fail2ban/config.local
^([[:blank:]]*maxretry[[:blank:]]*=)
匹配开头的任何空格(如果有),然后匹配字符串maxretry
,然后再次匹配任何空格(如果存在),然后=
把所有这些都放在捕获组 1 中(我们将在替换模式中引用它)其余部分只需匹配
.*
替换模式,,
\1 3
从捕获组中设置键,\1
并且我们使用值 3。
这会将maxretry
值设置为 3。
并且原始文件将备份为/etc/fail2ban/config.local.bak
,修改后的文件也将备份为/etc/fail2ban/config.local
。
如果您不想备份:
sed -Ei 's/^([[:blank:]]*maxretry[[:blank:]]*=).*/\1 3/' /etc/fail2ban/config.local