使用 sed 删除行开头的可选分号

Remove optional semicolon at line start with sed

我需要使用 sed:

取消注释并编辑这一行
root@host:~# cat $CONF | grep "pm\.max_requests"
;pm.max_requests = 500

试过了,但没有用:

root@host:~# sed -i "s/^;?pm\.max_requests *= *[^ ]*/pm.max_requests = 512/" ${CONF}
root@host:~# sed -i "s/^\;?pm\.max_requests *= *[^ ]*/pm.max_requests = 512/" ${CONF}
root@host:~# sed -i "s/^(;)?pm\.max_requests *= *[^ ]*/pm.max_requests = 512/" ${CONF}
root@host:~# sed -i "s/^(;?)pm\.max_requests *= *[^ ]*/pm.max_requests = 512/" ${CONF}

这是起作用的:

root@host:~# sed -i "s/^;pm\.max_requests *= *[^ ]*/pm.max_requests = 512/" ${CONF}

问题是,即使没有分号,该命令也必须起作用。

我知道我可以从下面的内容开始,但我希望我可以在一行中完成所有的事情。

sed -i "s/#;pm\.max_requests/pm.max_requests/g" ${CONF}

检查了这是否重复,但我能找到的只有

sed 默认使用基本正则表达式 (BRE) 正则表达式风格,它不会将 ? 解析为“0 或 1”量词。您的命令失败,因为它们试图匹配不存在的文字 ? 字符。

您的备选方案如下:

  • 一些实现支持 \? 作为“0 或 1”量词,尽管它不是 POSIX 定义的

     sed -i "s/^;\?pm\.max_requests *= *[^ ]*/pm.max_requests = 512/" ${CONF}
    
  • 您可以使用等效的 \{0,1\} 量词

     sed -i "s/^;\{0,1\}pm\.max_requests *= *[^ ]*/pm.max_requests = 512/" ${CONF}
    
  • 您可以使用 * 量词而不是 ?,这可能会导致删除多个连续的 ; 个字符

     sed -i "s/^;*pm\.max_requests *= *[^ ]*/pm.max_requests = 512/" ${CONF}
    
  • 您可以切换到扩展正则表达式 (ERE) 正则表达式风格,对 BSD sed 或现代 GNU sed 和 [=25= 使用 sed -E ] 用于较旧的 GNU sed。使用这种风格,? 量词将按您预期的方式工作。

     sed -iE "s/^;?pm\.max_requests *= *[^ ]*/pm.max_requests = 512/" ${CONF}