终端SED正则添加斜杠保留规则后横杠匹配失效问题求解
问题根因
横杠保留规则失效,本质是没搞懂sed正则字符集([]包裹的匹配段)的两个核心规则:
- 在POSIX正则的字符集内部,反斜杠
\默认不是转义符,会被当作普通的字面反斜杠处理。你之前写的\_\-\/里的反斜杠全是多余的,不仅不会实现转义效果,还会把反斜杠本身加入保留字符列表。 - 字符集里的横杠
-只有放在整个字符集的最开头或者最末尾时,才会被识别为字面意义的横杠;如果夹在两个字符中间,会被解析为范围运算符,用来匹配两个ASCII码区间内的所有字符,不会作为普通横杠被保留。
你第一次写的正则[^0-9a-zA-Z\.\_\-\/]里,横杠夹在字符中间被当成了范围运算符,自然不会被保留,所以横杠被错误删除;第二次写的正则里横杠刚好在字符集末尾,被识别为字面量所以保留正常,但你没把斜杠加入保留列表,路径斜杠就被全删掉了。
解决方案
不用给字符加多余的转义,直接把横杠放在字符集的最末尾即可。另外可以把sed替换命令的默认分隔符/换成#,就不用给路径里的斜杠转义,写法更简洁不容易出错。
正确命令如下:
echo "/path/to/file 20-456 (1).jpg" | sed -e 's/ /_/g' -e 's#[^0-9a-zA-Z./_-]##g'
执行后输出完全符合预期:
/path/to/file_20-456_1.jpg
这个正则的保留字符列表非常清晰:数字、大小写英文字母、点、路径斜杠、下划线、横杠,除此之外的所有字符都会被删除,不会出现匹配异常。
内容的提问来源于stack exchange,提问作者Dominic
相关产品推荐
相关产品推荐

