sed正则解析与其他工具差异及匹配失效问题排查
问题原因与解决办法
嘿,我来帮你捋清楚为啥你的sed命令没达到预期效果~
首先,你的核心需求是删除那些包含“非单词”的行,但你用的是s/...//g替换命令——这个命令只是把匹配到的行内容替换成空字符串,并不会删除整行。所以执行后那些行变成了空行,看起来好像文件内容没变化(只是元数据更新了),但实际上是留下了空行,而不是彻底删掉这些行。
你的正则表达式^\S*?\t[\W\d]+$是没问题的,确实能匹配到目标行,但sed的命令用错了类型。要删除匹配的行,应该用sed的删除命令d,而不是替换命令。
正确的命令应该是:
sed -ri '/^\S*?\t[\W\d]+$/d' sample.txt
这里的/pattern/d表示:找到所有匹配pattern的行,直接删除它们。这样就能精准删掉你说的第1、5、6行,留下符合要求的行。
再给你拆解下区别:
- 你原来的命令:
s/^\S*?\t[\W\d]+$//g→ 把匹配的行内容清空,行还在,变成空行 - 正确的命令:
/^\S*?\t[\W\d]+$/d→ 直接移除整个匹配的行,彻底从文件中删掉
如果之后你想验证效果,可以先不加-i参数(避免直接修改原文件),先输出到终端看看结果:
sed -r '/^\S*?\t[\W\d]+$/d' sample.txt
确认没问题后,再加上-i参数修改原文件就好啦~
内容的提问来源于stack exchange,提问作者fridde
相关产品推荐
相关产品推荐

