使用 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}
我需要使用 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
或现代 GNUsed
和 [=25= 使用sed -E
] 用于较旧的 GNUsed
。使用这种风格,?
量词将按您预期的方式工作。sed -iE "s/^;?pm\.max_requests *= *[^ ]*/pm.max_requests = 512/" ${CONF}