我有一个文件——
cat regex30.txt
(914).582.3013
(873).334.2589
(521).589.3147
(625).235.3698
(895).568.2145
(745).256.3369
我想将其转换为
914.582.3013
873.334.2589
521.589.3147
625.235.3698
895.568.2145
745.256.3369
这是我的步骤 -
sed -r 's/\(([0-9]<Space>{3})\)(\.[0-9]{3}\.[0-9]{4})/\1\2/g' regex30.txt
然后我得到结果 -
(914).582.3013
(873).334.2589
(521).589.3147
(625).235.3698
(895).568.2145
(745).256.3369
为什么我会得到这个结果?为什么空间在那里很重要?
如果我删除空间,那么它就可以正常工作。
sed -r 's/\(([0-9]{3})\)(\.[0-9]{3}\.[0-9]{4})/\1\2/g' regex30.txt
914.582.3013
873.334.2589
521.589.3147
625.235.3698
895.568.2145
745.256.3369
我的理解是[0-9] {3}
--表示3位数字,也可以从0开始。
[0-9]{3}
正则表达式和之间有什么区别[0-9] {3}
?
为什么空间在那里很重要,或者是我无法同时看到的东西。
我以为'\s'是用来表示空格的。
答案1
免责声明:我没有尝试解析您的正则表达式。这是您问题的答案。
[0-9]{3}
正好表示三位小数。[0-9] {3}
表示一个十进制数字后跟三个空格。之所以如此,是因为{3}
(即所谓的“束缚”)重复了其前面的所谓“原子”。
从正则表达式手册页:
$ man regex
... An atom followed by a bound containing one integer i and no comma
matches a sequence of exactly i matches of the atom. ...
术语“原子”在以下段落中定义。很棒的阅读。
答案2
我知道唯一可以忽略空格的正则表达式是 perl 正则表达式或兼容的正则表达式和 ast-open 正则表达式(它确实从 perl 正则表达式借用了许多运算符),尽管默认情况下不会这样做,只有在x
启用该标志时才这样做。
AFAIK,仅ssed
支持带有 -R 选项的 PCRE。
所以你需要:
ssed -R 's/ \d {3}/.../gx'
ssed -R 's/(?x) \d {3}/.../g'
或者(ast-open sed
,如果启用,它也是sed
ksh93 的内置函数):
ast-sed 's/\(?x\) \d \{3\}/.../g'
ast-sed -E 's/(?x) \d {3}/.../g'
ast-sed -A 's/(?x) \d {3}/.../g'
(对于它支持的 3 种正则表达式:基本、扩展、增强)。
启用该x
标志后,要匹配文字空格字符,您需要[ ]
在空格前加上前缀\
(或\x20
在基于 ASCII 的系统上使用)。