我有一个包含以下模式行的文件:
136x2340+1564+0
那是,<N1>x<N2>+<N3>+<N4>
。
我想过滤(也许使用grep
)所有行,N1
范围是从a
到b
和 N2
范围是从c
到d
。
常数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
也就是说,还显示N2
4 位数字的行(我认为只有 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