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