sed 删除匹配行 ?

2021-01-08 09:24:40 +08:00
 station
自定义 openwrt 默认设置

如何删除 dnsmasq 段落中的某一行

sed 试了试,我搞不定

config dnsmasq
option domainneeded '1'
option localise_queries '1'
option rebind_protection '1'
option rebind_localhost '1'
option local '/lan/'
option expandhosts '1'
option authoritative '1'
option readethers '1'
option leasefile '/tmp/dhcp.leases'
option resolvfile '/tmp/resolv.conf.d/resolv.conf.auto'
option nonwildcard '1'
option localservice '1'
option filter_aaaa '1'
option domain 'lan'

config dhcp 'lan'
option interface 'lan'
option start '100'
option limit '150'
option leasetime '12h'

config dhcp 'wan'
option interface 'wan'
option ignore '1'

config srvhost
option srv '_vlmcs._tcp'
option target 'OpenWrt'
option port '1688'
option class '0'
option weight '100'
2797 次点击
所在节点    Linux
17 条回复
qakito
2021-01-08 09:29:41 +08:00
uci 配置文件有提供统一的读写接口:
Usage: uci [<options>] <command> [<arguments>]

Commands:
batch
export [<config>]
import [<config>]
changes [<config>]
commit [<config>]
add <config> <section-type>
add_list <config>.<section>.<option>=<string>
del_list <config>.<section>.<option>=<string>
show [<config>[.<section>[.<option>]]]
get <config>.<section>[.<option>]
set <config>.<section>[.<option>]=<value>
delete <config>[.<section>[[.<option>][=<id>]]]
rename <config>.<section>[.<option>]=<name>
revert <config>[.<section>[.<option>]]
reorder <config>.<section>=<position>

Options:
-c <path> set the search path for config files (default: /etc/config)
-d <str> set the delimiter for list values in uci show
-f <file> use <file> as input instead of stdin
-m when importing, merge data into an existing package
-n name unnamed sections on export (default)
-N don't name unnamed sections
-p <path> add a search path for config change files
-P <path> add a search path for config change files and use as default
-q quiet mode (don't print error messages)
-s force strict mode (stop on parser errors, default)
-S disable strict mode
-X do not use extended syntax on 'show'
Raos
2021-01-08 09:36:45 +08:00
sed '/local/d'
lihuoqingfly
2021-01-08 09:41:29 +08:00
参考手册: https://quickref.me/sed
IgniteWhite
2021-01-08 09:45:47 +08:00
你还可以试试 awk 啊
station
2021-01-08 09:47:45 +08:00
@Raos sed '/option domain 'lan'/d' dhcp 不行哦~
diaryevil
2021-01-08 09:49:03 +08:00
@station 四个单引号上转义符啊
zent00
2021-01-08 09:51:20 +08:00
比如删除 option rebind_localhost '1' 这一行:

sed -i "/option rebind_localhost '1'/d" dnsmasq.conf
IgniteWhite
2021-01-08 09:56:11 +08:00
看了楼主在 5 楼的代码,我只能说

君 regex 本当上手

另外根据你系统不一样,shell 不一样,有时候要用 sed -e,有时候对于双引号的严格性也不同。这些信息也不写在问题里……
IgniteWhite
2021-01-08 09:59:34 +08:00
纠正,是-E,不是小写
xgfan
2021-01-08 10:17:25 +08:00
目测一楼才是正解
Raos
2021-01-08 10:29:31 +08:00
@station sed "/option domain 'lan'/d"
@zent00 正解
Raos
2021-01-08 10:30:47 +08:00
@lihuoqingfly 收藏了
tachikomachann
2021-01-08 10:51:30 +08:00
sed 不知道,但是 vim 的话,用 g 命令可以
:g/要匹配的关键字 /d
aibangjuxin
2021-01-08 12:24:04 +08:00
考虑效率?
cat a|sed -e '/./{H;$!d;}' -e 'x;/dnsmasq/!d;'|sed '/domainneeded/d'
domainneeded 为要删除的行
doumeki
2021-01-08 16:41:47 +08:00
说个题外话,如果是编译之前自定义,还是写成 patch 吧。
运行时的话使用一楼说的 uci.

PS: 我自己写了改了几十个编译自定义文件,全是用的 patch 方式。
hzjseasea
2021-01-08 17:18:32 +08:00
cat xx | sed "/option leasefile '\/tmp\/dhcp.leases'/d"
byaiu
2021-01-08 19:26:24 +08:00
忘了-i 了吧

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/742773

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX