bash / sh 脚本来替换文本文件中某些标签/字符串之间的文本

Str*_*Hat 6 shell openwrt replace

我正在创建将使用 /bin/sh 或 /bin/bash 脚本执行的可执行文件,
我有一个包含结构的文件,例如,配置文件中只有一个#start#end标签,我想替换它们之间的文本那些标签,

...

#start
FirewallRuleSet global {
    FirewallRule allow tcp to google.com
    FirewallRule allow tcp to facebook.com

#more rules
}
#end

FirewallRuleSet known-users {
    FirewallRule allow to 0.0.0.0/0
}

...
Run Code Online (Sandbox Code Playgroud)

所需的输出将是,

...

#start
FirewallRuleSet global {
    FirewallRule allow tcp to google.com
    FirewallRule deny tcp to facebook.com
    FirewallRule deny tcp to twitter.com
    FirewallRule allow tcp to exaple.com



#more rules
}
#end

FirewallRuleSet known-users {
    FirewallRule allow to 0.0.0.0/0
}

...
Run Code Online (Sandbox Code Playgroud)

我怎样才能更换之间的整个文本#start#end一些新的文本?我只想在这个配置文件中添加或删除规则。

这是配置文件的一部分,我想修改该文本中允许的 url。

G-M*_*ca' 6

sed '/#start/,/#end/ replace_command '

例如,如果文件名为myconfig,并且您想在该部分将“允许”替换为“拒绝”,则可以说

sed '/#start/,/#end/replace_command'

这将保持文件不变,并在标准输出上显示修改后文件的外观。您可能应该先执行此操作,以验证您的命令是否正确。如果要实际更改文件,请添加-i选项:

sed '/#start/,/#end/s/allow/deny/' myconfig
Run Code Online (Sandbox Code Playgroud)

如果你想替换这两行之间的整个文本(所有文本),你可以做一些比卢卡斯的回答稍微简单的事情:

sed '/#start/,/#end/c\
新文本行 1\
新文本行 2\
        ? \
新文本行n -1\
新文本行n (last)' ? 关闭报价;这里没有反斜杠

cÇ在焊割命令sed(和ed); 它的意思是“替换整行”。您不能简单地保持#start#end线不变。如果你想保留它们,你必须重新插入它们:

sed -i '/#start/,/#end/s/allow/deny/' myconfig
Run Code Online (Sandbox Code Playgroud)

/#start/,/#end/指定一个范围 - 从包含#start 的第一行到包含#end. 如果您需要查找包含这些字符串而没有其他内容的行,请使用/^#start$/,/^#end$/.