如何改进sed命令以删除fstab中的两类注释行
如何改进sed命令以删除fstab中的两类注释行
嗨,我来帮你搞定这个sed命令的问题~
首先你遇到的语法错误,是因为sed不支持你写的/data/ /^[[:blank:]]*#/d这种格式——你把两个匹配条件直接用斜杠分开,sed会把第二个斜杠当成一个未知命令,所以才报错。
结合你的需求(删除包含"data"的注释行,注释行允许开头带空格/TAB),给你两种靠谱的修正写法:
方法1:合并正则表达式(推荐)
把两个匹配条件合并成一个正则,精准匹配「开头0个或多个空白字符+#,且后续内容包含data」的行,然后删除:
sed '/^[[:blank:]]*#.*data/d' /etc/fstab
拆解一下正则逻辑:
^[[:blank:]]*:匹配行首的0个或多个空白(空格/TAB都包含)#:匹配注释符号.*data:匹配#后面任意内容里包含"data"的部分
这个命令会删掉你例子里那两行包含data的注释行,同时保留其他不包含data的注释行。
方法2:用sed嵌套条件匹配
如果觉得合并正则有点绕,也可以用sed的块命令写法,先筛选出所有注释行,再在其中删除包含data的行:
sed '/^[[:blank:]]*#/{/data/d}' /etc/fstab
逻辑解释:
/^[[:blank:]]*#/:先匹配所有符合格式的注释行{/data/d}:在这些注释行里,再筛选出包含"data"的行并执行删除操作
这两种写法都能完美解决你的问题,选哪个看你觉得哪个更直观~
最后补充个小提醒:如果你其实是想删除所有注释行,同时额外删除包含data的非注释行,可以用-e选项添加多个删除规则:
sed -e '/^[[:blank:]]*#/d' -e '/data/d' /etc/fstab
备注:内容来源于stack exchange,提问作者King David
相关产品推荐
相关产品推荐

