sed 用某种占位符替换字符串

sed 用某种占位符替换字符串

我对 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

相关内容