首页 > 解决方案 > 删除以 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}

检查这是否是重复的,但我能找到的只是使用 shell 命令从 php.ini 中的一行中删除了分号

标签: sedshposix

解决方案


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

您的选择如下:

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

     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) 正则表达式风格,sed -E用于 BSDsed或现代 GNUsedsed -r旧 GNU sed。有了这种风格,?量词将按照您的预期工作。

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

推荐阅读