Sed:搜索字符串长度和特定字符

时间:2015-12-20 13:43:46

标签: regex string replace sed

我一直在搜索几个小时,找到一个包含21个数字字符的字符串,并在字符串本身前面放置一个返回值。最后我找到了解决方案:

sed -r 's/\b[0-9]{21}\b/\n&/g'

效果很好!

现在我有一组包含21个数字字符的新数据,但除此之外,字符串末尾有一些字母字符,长度可变,为3到10个字符。

示例输入:

169349870913736210308ABC
168232727246529300209DEFGHI
166587299965005120122JKLMNOPQRS
162411281984306600005TUVWXYZ

我想要的是在数字和字母字符之间留一个空格:

169349870913736210308 ABC
168232727246529300209 DEFGHI
166587299965005120122 JKLMNOPQRS
162411281984306600005 TUVWXYZ

请注意每个号码开头的16。我尝试过使用:

sed -r 's/^\b[0-9]{21}\+[A-Z]{3,10}\b/ /g' filename

但是我无法让它工作,因为我不知道并且无法找到如何专门搜索包含精确数量字符和特殊长度的字母字符的字符串。我在这个网站上发现了很多有用的问题,但是这个我找不到。

3 个答案:

答案 0 :(得分:3)

使用捕获组。

sed -r 's/^([0-9]{21})([A-Z]{3,10})$/\1 \2/' filename

答案 1 :(得分:1)

从左到右搜索第一个非数字字符([^0-9])并将其替换为空格和匹配的(&)非数字字符:

sed 's/[^0-9]/ &/' file

输出:

169349870913736210308 ABC
168232727246529300209 DEFGHI
166587299965005120122 JKLMNOPQRS
162411281984306600005 TUVWXYZ

答案 2 :(得分:0)

为什么不在前21个字符后添加一个空格,如下所示:

sed 's/^...................../& /g'