使用sed删除嵌套目录HTML文件中^@特殊控制字符的正确语法是什么
正确执行语法
根据你使用的sed版本选择对应命令即可:
- 绝大多数Linux发行版默认搭载的GNU sed适用命令:
find . -type f -name "*.html" -exec sed -i 's/\x00//g' {} + - macOS/BSD系统默认搭载的BSD sed适用命令:
find . -type f -name "*.html" -exec sed -i '' 's/\x00//g' {} +
原有命令失效原因
- find参数写法错误:
find ./ *.html的写法逻辑不严谨,无法精准匹配所有嵌套子目录下的.html文件,正确写法是通过-name参数指定后缀匹配规则 - 控制字符匹配错误:你写的
^@只是终端对空字节的可视化占位符,无法直接被sed识别,空字节的标准转义写法为十六进制\x00或者八进制\o0 - exec结尾符未转义:原命令结尾的
;必须转义为\;才能被find识别,或者直接用+替代,后者会将批量匹配到的文件一次性传给sed处理,处理数千个文件的效率要高很多 - 原地修改参数规则不匹配:BSD系sed的
-i原地修改参数必须显式指定备份文件后缀,不需要保留备份的话传入空字符串''即可,否则会直接报错
测试验证方法
修改前可以先抽取单个文件验证替换效果,确认没问题再执行全量替换:find . -type f -name "*.html" | head -1 | xargs sed 's/\x00//g'
如果上述写法还是匹配不到空字符,可以把替换规则改成shell原生转义的写法:s/'$'\0''//g
内容的提问来源于stack exchange,提问作者harry_belefonte
相关产品推荐
相关产品推荐

