如何用正则匹配指定数量制表符行?sed移除双制表符行换行及Vim正则问题
问题解答:匹配精确制表符行与sed处理换行符
1. 正则匹配包含精确数量制表符的行
要匹配恰好N个制表符的行,核心是得精准控制行内制表符的数量,不能用简单的\t.*\t(这种写法会匹配所有包含至少两个制表符的行)。我们可以用“非制表符+制表符”的组合来实现精确匹配:
比如要匹配恰好2个制表符的行,正则表达式可以写成:
^[^\t]*\t[^\t]*\t[^\t]*$
拆解一下逻辑:
^:锁定行的开头[^\t]*:匹配0个或任意多个非制表符的内容\t:匹配一个制表符- 重复“非制表符+制表符”的组合N次(这里是2次),最后用
[^\t]*$匹配行尾的非制表符内容,确保没有多余的制表符
如果要匹配其他数量,比如恰好3个制表符,只需调整组合次数:
^[^\t]*\t[^\t]*\t[^\t]*\t[^\t]*$
2. 用sed匹配恰好两个制表符的行并移除换行符
sed处理换行符需要借助模式空间的操作,我们可以先定位到目标行,再将其与下一行合并(也就是移除该行的换行符)。具体命令如下:
sed '/^[^\t]*\t[^\t]*\t[^\t]*$/{N;s/\n//}' input.txt
各部分作用:
/^[^\t]*\t[^\t]*\t[^\t]*$/:精准定位到恰好包含两个制表符的行{N}:把下一行内容读入当前模式空间,此时模式空间里的内容是“匹配行\n下一行”s/\n//:将模式空间里的换行符替换为空,实现移除匹配行换行符的效果
如果你的需求是让匹配行直接衔接后续内容,这个命令就能满足要求。
修正你在Vim中的错误匹配
你之前用的/\v\t.*\t.*之所以会错误匹配第4行(推测该行有超过2个制表符),是因为这个表达式只要求行内至少有两个制表符,没有锁定行尾——哪怕后面还有更多制表符,它也会匹配前两个制表符及后续内容。
要在Vim中精确匹配恰好两个制表符的行,改用这个very magic模式的正则就可以了:
/\v^[^\t]*\t[^\t]*\t[^\t]*$
加上^和$锁定行首行尾,再用[^\t]*确保制表符之间和前后都是非制表符内容,这样就只会匹配恰好两个制表符的行啦。
内容的提问来源于stack exchange,提问作者jjk
相关产品推荐
相关产品推荐

