使用sed命令时如何正确转义./作为匹配模式实现字符串截取
问题解决
你要匹配字面量./,需要对sed正则里的两个特殊字符做转义:
.是正则元字符,默认匹配任意单个字符,要匹配字面量点需要加转义符写成\./是sed默认的正则分隔符,要匹配字面量斜杠需要加转义符写成\/
替换后的完整命令如下:
lastblock="./2.json" echo $lastblock | sed '1,/\.\//d;/.json/,$d'
更适配单行路径的优化方案
如果你只是处理单个路径字符串(只有1行输入),原来的行范围删除逻辑其实没必要用,有更简单、可读性更高的写法:
1. 简化sed写法
直接替换首尾的目标字符串即可:
echo $lastblock | sed 's/^\.\///;s/\.json$//'
逻辑说明:
s/^\.\///匹配行首的./替换为空s/\.json$//匹配行尾的.json替换为空
2. 纯Bash原生参数扩展(无需调用外部命令)
不用管道、不用sed/grep等外部工具,用Bash内置的参数扩展操作性能更高:
lastblock="./2.json" # 去除前缀./ temp="${lastblock#./}" # 去除后缀.json result="${temp%.json}" echo "$result"
额外纠正
你之前提到的「grep仅支持对文件操作,无法直接处理标准输出内容」是错误认知,grep完全支持读取管道传入的标准输入,比如echo "test content" | grep "content"是可以正常执行的。
内容的提问来源于stack exchange,提问作者dani 'SO learn value newbies'
相关产品推荐
相关产品推荐

