当我想更改和in 的著名2M
比例时,我使用以下与版本无关的两行解决方案(请参见星号):post_max_size
upload_max_size
php.ini
sed
sed -i 's/post_max_size \= .M/post_max_size \= 200M/g' /etc/php/*/fpm/php.ini
sed -i 's/upload_max_filesize \= .M/upload_max_filesize \= 200M/g' /etc/php/*/fpm/php.ini
是否有更短、更简约的方法来在单个命令中执行相同的两个对象更改?仍然安全且与版本无关的东西。
我使用 Nginx 作为 Web 服务器。
答案1
同时执行两个参数的一种笨拙方法是
sed -i 's/^(\w*[td]_max_\w*size\s*=\s*).M/\1200M/'文件名
首先,根据这个php.ini 指令列表_max_
,包含并以 结尾的关键字只有三个size
:
imlib2.font_cache_max_size
post_max_size
upload_max_filesize
请注意,紧接在 之前的字母_max_
在每种情况下都不同:
imlib2.font_cache_max_size
→e
post_max_size
→t
upload_max_filesize
→d
所以,通过搜索[td]_max_
,我们可以消除第一个。
详细命令:
^
当然,限制正则表达式匹配行开头的匹配项。如果要匹配不在行开头的字符串,请删除^
.注意:除非您添加其他内容来指定,否则这将导致命令更改注释掉的行,这可能会令人困惑。\(…\)
标识一组字符。我们将使用它来匹配所有内容(但是不是包括)参数值(即 后面的数字=
)。\w*[td]_max_\w*size
火柴- 任意数量的“单词”(字母数字)字符,
- 一个
t
或一个d
, _max_
,- 任意数量(可能为零)的单词字符,以及
size
。
\s*=\s*
匹配任意数量的空格字符(常规空格或制表符)、一个=
,以及任意数量的空格字符。(您不需要说\=
。)这是该组的结尾,以 标记
\)
。- 如您所知,
.M
匹配 后跟的任何字符M
。 (你已经在使用这个了。) \1200M
看起来很混乱,但这只是\1
,将组中的字符替换\(…\)
为自身,- 后面跟着
200M
,这是您想要替换nM
数字的内容。
g
除非您希望匹配同一行上的多个字符串(如果您使用 将正则表达式锚定到行的开头,则这是不可能的^
),否则不需要。
代替filename(s)
与您的/etc/php/*/fpm/php.ini
glob 或任何其他文件名或文件名列表。
在执行上述操作之前,您应该运行
sed -n 's/^(\w*[td]_max_\w*size\s*=\s*).M/\1200M/p'文件名这将显示第一个命令将执行的操作。