如何使用sed排除输出中的指定内容 当前sed匹配规则未生效求助
问题核心原因
你当前的操作存在两个问题,导致过滤失效:
- 正则语法适配问题:sed默认使用基础正则表达式(BRE)规则,其中范围量词
{m,n}必须加反斜杠转义才能被识别为正则语法,你写的[^0-9]{1,4}中的{1,4}会被当作普通字面量字符处理,完全没有生效。 - 命令逻辑不匹配:你用的
s是字符串替换命令,作用是修改行内匹配到的内容,而非过滤整行。就算正则生效,执行后的效果也只是把行内的非数字字符删掉,比如downloadAll.sh、amazon会变成空行,依旧会出现在输出结果中,达不到删除整行的效果。
正确实现方案
方案1:使用sed过滤行
如果要保留仅由1-4位数字组成的行,用sed的行匹配打印逻辑即可:
# 基础正则写法,兼容所有sed版本 ls | sed -n '/^[0-9]\{1,4\}$/p' # 扩展正则写法,无需转义大括号,兼容性也较好 ls | sed -nE '/^[0-9]{1,4}$/p'
参数说明:
-n:关闭sed默认打印所有行的行为- 正则中
^匹配行首,$匹配行尾,保证整行都是数字 p:只打印匹配到正则的行,非数字行直接丢弃
方案2:使用grep更简单
行过滤场景用grep写法更简洁:
ls | grep -E '^[0-9]{1,4}$'
内容的提问来源于stack exchange,提问作者Geoff Langenderfer
相关产品推荐
相关产品推荐

