sed - 删除以 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 中的一行中删除了分号
解决方案
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
或现代 GNUsed
和sed -r
旧 GNUsed
。有了这种风格,?
量词将按照您的预期工作。sed -iE "s/^;?pm\.max_requests *= *[^ ]*/pm.max_requests = 512/" ${CONF}
推荐阅读
- sas - SAS DI 中 SCD2 变换的替代方案
- node.js - node.js 加密 pbkdf2 返回未定义
- amazon-web-services - Terraform 多个实例,但通过单独执行
- java - 从 RecyclerView 中删除项目仍然在后台显示
- c++ - 立即函数的参数
- c++ - 使用 C++17 填充 constexpr 数组
- plotly-dash - 动态更改线条颜色 dcc.Graph Plotly Dash 在注释之间
- python - “QGLXContext:无法在 Windows10 WSL2 中使用 PyQt5 创建虚拟上下文”
- python - 为收到的 PDF 文档添加唯一的文件 ID
- java - 初始化 MqttWireMessage 时出现异常 NoClassDefFoundError