如何使用sed替换制表符文件第二列中的数字下划线模式
解决sed删除第二列数字_前缀的问题
嘿,我来帮你搞定这个sed的问题!你遇到的麻烦主要是sed默认的正则规则和你习惯的Perl风格正则不兼容,加上没精准定位第二列内容,下面一步步给你解决:
为什么之前的命令失败?
你用的\d+是Perl/PCRE风格的正则语法,但sed默认用基础正则表达式(BRE),不支持这些写法:
\d:sed里没有这个代表数字的简写,得用[0-9]或者POSIX标准的[[:digit:]]+:在BRE里+是普通字符,要表示“一个或多个”得转义成\+;要是想用不转义的+,得开启扩展正则模式- 另外你的命令没限定只替换第二列内容,这次第一列结构不会被误匹配,但精准匹配总归更稳妥
正确的sed命令
方法1:使用基础正则表达式(BRE)
适配sed默认规则,精准匹配制表符后的数字_前缀:
sed 's/\t[0-9]\+_/\t/' infile
解释:
\t:匹配两列之间的制表符,确保只处理第二列的开头部分[0-9]\+:匹配一个或多个数字(\+是BRE里的“一个或多个”量词)_:匹配下划线- 替换成
\t,相当于把第二列开头的数字_直接去掉,保留后面的内容
方法2:使用扩展正则表达式(ERE)
加-E选项(GNU sed也支持-r,BSD sed用-E即可),语法更直观:
sed -E 's/\t[[:digit:]]+_/\t/' infile
解释:
-E:开启扩展正则模式,不用转义+[[:digit:]]:POSIX标准的数字匹配,比[0-9]更通用(支持非阿拉伯数字场景,这里效果一致)
验证输出
运行上面的命令后,就能得到你想要的结果:
BB_12 AA BB_13 AB BB_14 AD BB_15 AC
如果你的文件分隔符是空格而非制表符,把\t换成空格就行,不过你明确说是制表符分隔,用\t会更准确。
内容的提问来源于stack exchange,提问作者Arun
相关产品推荐
相关产品推荐

