我正在尝试使用bash脚本编辑标签之间的一组值。我将通过脚本将相同的代码用于其他一些值。
我的代码到目前为止:
function preforkeditor {
httpedit=$1
read -e -p "What is our new Start Servers? " -i 8 ifmodfork_StartServers
read -e -p "What is our new Min Spare Server? " -i 5 ifmodfork_MinSpareServer
read -e -p "What is our new Max Spare Server? " -i 20 ifmodfork_MaxSpareServers
read -e -p "What is our new Server Limit? " -i 256 ifmodfork_ServerLimit
read -e -p "What is our new Max Clients? " -i 256 ifmodfork_MaxClients
read -e -p "What is our new Max Request Per Child? " -i 4000 ifmodfork_MaxRequestsPerChild
sed -n '/<IfModule prefork*/,/<\/IfModule>/p' $httpdedit
}
这会提取我要查找的信息,但我不知道如何编辑信息。
我还尝试使用我在网上找到的几行代码,但搜索不起作用。
sed -i "/^<IfModule prefork*/,/^IfModule>/{
/StartServers/ s/${startserver} */9/
/MinSpareServer/ s/${MinSpareServers} */3/
/MaxSpareServers/ s/${MaxSpareServers} */21/
/ServerLimit/ s/${ServerLimit} */300/
/MaxClients/ s/${MaxClients} */300/
/MaxRequestsPerChild/ s/${MaxRequestsPerChild} */5000/
}" httpd.test
下面是我试图编辑的信息。
<IfModule prefork.c>
StartServers 8
MinSpareServers 5
MaxSpareServers 20
ServerLimit 256
MaxClients 256
MaxRequestsPerChild 4000
</IfModule>
如果您知道更简单的方法,请告诉我。我的目标是改变以改变数字。相同的值是我尝试编辑的文件中的其他位置。
答案 0 :(得分:1)
也许稍微修改一下你自己的建议就可以了:
sed "/^<IfModule prefork*/,/^<\/IfModule>/ {
/StartServers/ s/[0-9][0-9]*/9/
/MinSpareServer/ s/[0-9][0-9]*/3/
/MaxSpareServers/ s/[0-9][0-9]*/21/
/ServerLimit/ s/[0-9][0-9]*/300/
/MaxClients/ s/[0-9][0-9]*/300/
/MaxRequestsPerChild/ s/[0-9][0-9]*/5000/
}" httpd.test
如果您有最近的sed
,则可以将[0-9][0-9]*
替换为[0-9]\+
。如果您的任何关键字都有数字,则需要添加尖括号\<[0-9][0-9]*\>
。
其他变化:
/^IfModule>/
至/^<\/IfModule>/
/^<IfModule prefork/
不需要*
此外,您可能希望更改第一次替换,例如:
/StartServers/ s/[0-9][0-9]*/$ifmodfork_StartServers/
使用用户的输入。
答案 1 :(得分:0)
将以下内容放入名为Foo.sed
的文件中。 根据您的其余更改添加适当的行。
它只会在以包含<IfModule prefork.c>
的行开头并以包含</IfModule>
的行结尾的块内执行花括号内的替换。 \1
是对先前匹配的表达式的反向引用。
/<IfModule prefork.c>/,/<\/IfModule>/ {
s/\(StartServers\s\+\)[0-9]\+/\1 11/
s/\(MinSpareServers\s\+\)[0-9]\+/\1 12312321/
}
然后像这样运行:
sed -f Foo.sed Input.txt
它会将转换后的版本打印到标准输出。 如果您对输出感到满意,则可以进行就地更改
sed -i -f Foo.sed Input.txt