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。
用
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$/.