如何使用sed原地删除含指定后缀的行及其下一行
解决sed原地删除多模式行及其下一行的问题
核心问题分析
你之前的命令无效主要有三个原因:
- 正则中的
.未转义:在sed正则里,.代表任意字符,.mkv会匹配xmkv这类无关行,而非精确匹配包含.mkv的行。 - 第二个命令存在语法错误:脚本中间插入的
-e不符合sed语法规则,导致命令无法执行。 - 不同系统的sed对
-i参数处理有差异:GNU sed(Linux)和BSD sed(macOS)的-i用法不同。
正确的原地修改命令
适用于Linux(GNU sed)
可以用分组正则合并多个模式,写法更简洁:
sed -i '/\.\(mkv\|mp4\|avi\)/{N;d}' "${myfile}"
也可以拆分多个-e参数,逻辑更清晰:
sed -i -e '/\.mkv/{N;d}' -e '/\.mp4/{N;d}' -e '/\.avi/{N;d}' "${myfile}"
适用于macOS(BSD sed)
BSD sed要求-i后必须指定备份扩展名(空字符串表示不生成备份文件):
sed -i '' '/\.\(mkv\|mp4\|avi\)/{N;d}' "${myfile}" # 或者拆分版本 sed -i '' -e '/\.mkv/{N;d}' -e '/\.mp4/{N;d}' -e '/\.avi/{N;d}' "${myfile}"
命令说明
\.\(mkv\|mp4\|avi\):转义.避免匹配任意字符,用\|分隔多个扩展名,精准匹配包含.mkv/.mp4/.avi的行。{N;d}:N将下一行追加到当前模式空间,d删除模式空间中的内容(即当前匹配行+下一行)。"${myfile}":用双引号包裹变量,避免文件名含空格时出现执行错误。
内容的提问来源于stack exchange,提问作者ni_hao
相关产品推荐
相关产品推荐

