使用bash编辑文件中两行文本之间的文本

时间:2014-04-15 00:56:41

标签: bash sed

我正在尝试使用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>

如果您知道更简单的方法,请告诉我。我的目标是改变以改变数字。相同的值是我尝试编辑的文件中的其他位置。

2 个答案:

答案 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