过滤包含一定范围内的数字的字符串并更改格式

过滤包含一定范围内的数字的字符串并更改格式

我有一个包含以下模式行的文件:

136x2340+1564+0

那是,<N1>x<N2>+<N3>+<N4>

我想过滤(也许使用grep)所有行,N1范围是从ab N2范围是从cd

常数a,b,c,d取决于我的问题。我会在脚本中修复它们。

我尝试过egrep '^([0-9][0-9][0-9]x[0-9][0-9][0-9]+)',但输出显示

136x2340+1564+0
835x428+355+1780
817x406+186+747
114x1533+1256+456

也就是说,还显示N24 位数字的行(我认为只有 3 位数字)。

编辑:我还想x,(逗号)替换,第一个+符号用(空格)替换,第二个+符号用,(逗号)替换,所以输出应该是

N1,N2 N3,N4

答案1

在 grep 扩展正则表达式 (ERE) 语法中,+是一个量词,表示“一个或多个前面的原子”。要+在此上下文中进行字面匹配,您需要对其进行转义:

egrep '^([0-9][0-9][0-9]x[0-9][0-9][0-9]\+)' file
835x428+355+1780
817x406+186+747

如果你想做替换,那么grep确实不是正确的工具 - 但是如果您的版本sed具有类似的扩展正则表达式模式,您可以使用它:

sed -En 's/([0-9]{3})x([0-9]{3})\+([0-9]{1,})\+([0-9]{1,})/\1,\2 \3,\4/p' file
835,428 355,1780
817,406 186,747

如果您只有基本的正则表达式,转义就会变得更难以阅读:

sed -n 's/\([0-9]\{3\}\)x\([0-9]\{3\}\)+\([0-9]\{1,\}\)+\([0-9]\{1,\}\)/\1,\2 \3,\4/p' file
835,428 355,1780
817,406 186,747

相关内容